pero para postgres (la he llamado TPqSqlServer y TPqSqlQuery), he tomado como base la tpostgres y tmysql de contrib de xharbour,
he realizado varios cambios, y la llevo bastante avanzada, pero actualmente tengo un problema con xbrowse, y es que no me muestra los datos,
ya que xbrowse internamente esta desarrollada para soportar dolphin, tmysql, ado, dbf, arrays, y las nuevas clases de de fwh.
en el ejemplo que muestro, todo me funciona, salvo lo del mostrar los datos con xbrowse,
me pudiera dar una mano con esto por favor.
lo he probado con un server 8.4,
en el enlace pongo lo necesario para compilar el ejemplo con xharbour y borland c 7.x.
habria que cambiar ip del server, y la base de datos a los propio.
http://castillolawyers.no-ip.info/owncloud/index.php/s/yvVyVYHbqYKxtCQ
- Code: Select all Expand view RUN
#include "fivewin.ch"
#include "xbrowse.ch"
REQUEST HB_LANG_ES
REQUEST DBFCDX, DBFFPT
EXTERNAL OrdKeyNo, OrdKeyCount, OrdKeyGoto
procedure main()
local oServer, oQuery
local aStruct
local oBrw
local oErr
HB_LangSelect("ES")
RDDSetDefault( "DBFCDX" )
set cent on
set date brit
//MsgInfo("Inicio")
oServer := TPqSQLServer():new( "192.168.1.105", "northwind", "postgres", "postgres", 5432 )
if oServer:NetErr()
MsgInfo( oServer:ErrorTxt() )
oServer:End()
return
else
?"connected..."
oServer:TraceOn( "prueba.txt" )
endif
?"Database:", oServer:cDBName,"Schema:", oServer:cSchema
?"Existe tabla customers? ", oServer:TableExists( "customers" ),;
"Existe tabla clientes? ", oServer:TableExists( "clientes" )
xbrowse( oServer:ListTables() )
oServer:DeleteTable( "clientes1" )
if oServer:NetErr()
MsgInfo( oServer:ErrorTxt() )
else
?"tabla clientes1 borrada!"
endif
oServer:DeleteTable( "prueba" )
if oServer:NetErr()
MsgInfo( oServer:ErrorTxt() )
else
?"tabla prueba borrada!"
endif
?"clientes.dbf existe? ", file( "clientes.dbf" )
use clientes new
aStruct := clientes->( dbstruct() )
fwdbg aStruct
?"table prueba crated? ",oServer:CreateTable( "prueba", aStruct, "my_recno", "my_recno" )
if oServer:NetErr()
MsgInfo( oServer:ErrorTxt() )
endif
fwdbg oServer:TableStruct( "prueba" ), ;
oServer:TableStruct( "customer" ),;
oServer:TableStruct( "customers" ),;
oServer:TableStruct( "employees" )
?"creacion de index 1: ",oServer:CreateIndex( "fullname", "prueba", {"firsts","lasts"}, .t. )
?"creacion de index 2: ",oServer:CreateIndex( "fullname", "prueba", {"firsts","lasts"}, .f. )
if oServer:NetErr()
MsgInfo( oServer:ErrorTxt() )
endif
MsgInfo("verifique creacion de index")
oServer:ThrowError( .t. )
try
oServer:StartTransaction()
oServer:Execute( "insert into prueba (firsts,lasts) values ('carlos','vargas')" )
oServer:Execute( "insert into prueba (firsts,lasts) values ('reyna','montoya')" )
oServer:Execute( "insert into prueba (firsts,lasts) values ('nicole','vargas')" )
oServer:Commit()
catch oErr
oServer:Rollback()
?oErr:description
end
oServer:ThrowError( .f. )
//?"eliminacion de index: ",oServer:DeleteIndex( "fullname", "prueba" )
oQuery := oServer:Query( "select * from prueba" )
if oServer:NetErr()
MsgInfo( oServer:ErrorTxt() )
oServer:End()
return
endif
fwdbg oQuery:RecCount(), oQuery:RecNo(), oQuery:Bof(), oQuery:Eof()
xbrowse( oQuery )
oQuery:GoTop()
do while !oQuery:eof()
?oQuery:firsts, oQuery:married, valtype(oQuery:married), oQuery:salary, valtype(oQuery:salary), oQuery:RecNo()
oQuery:Skip()
enddo
// esta columna no existe, salta error
//?oQuery:fullname //
fwdbg oQuery:Bof(), oQuery:Eof(), oQuery:RecNo()
xbrowser oQuery SETUP ( SetPostgre( oBrw, oQuery, .t. ) )
oQuery:End()
oServer:End()
return
PROCEDURE SetPostgre( oBrw, oQry, lAddCols )
LOCAL xField := NIL
LOCAL cHeader := ""
LOCAL cCol := ""
LOCAL aFldNames, oCol
IF lAddCols == NIL
lAddCols = .T.
ENDIF
WITH OBJECT oBrw
:bGoTop := {|| If( oQry:LastRec() > 0, oQry:GoTop(), NIL ) }
:bGoBottom := {|| If( oQry:LastRec() > 0, oQry:GoBottom(), nil ) }
:bSkip := {| n | oQry:Skip( n ) }
:bBof := {|| oQry:Bof() }
:bEof := {|| oQry:Eof() }
:bBookMark := {| n | If( n == nil,;
If( oQry:LastRec() > 0, oQry:RecNo(), 0 ), ;
If( oQry:LastRec() > 0, oQry:goto( n ), 0 ) ) }
:bKeyNo := {| n | If( n == nil, ;
If( oQry:LastRec() > 0, oQry:RecNo(), 0 ), ;
If( oQry:LastRec() > 0, oQry:Goto( n ), 0 ) ) }
:bKeyCount := {|| oQry:LastRec() }
END
oBrw:nDataType := DATATYPE_USER
//oQry:Cargo = oQry:aStructure[ 1 ][ 1 ]
IF lAddCols
aFldNames := oQry:Struct() //aStructure
FOR EACH xField IN aFldNames
cCol := xField[ 1 ]
cHeader := xField[ 1 ]
oCol = SetColFromPostgre( cCol, cHeader, oQry, oBrw )
//set order
NEXT
ENDIF
RETURN
FUNCTION SetColFromPostgre( cnCol, cHeader, oQry , oBrw )
LOCAL nType, cType, nLen, nDec, cName
LOCAL oCol, nCol
IF ValType( cnCol ) == "C"
nCol := oQry:FieldPos( cnCol )
ENDIF
cName := oQry:FieldName( nCol )
DEFAULT ;
nCol := cnCol
oCol := oBrw:AddCol()
oCol:cHeader := cHeader
cType := oQry:FieldType( nCol )
nLen := 0
nDec := 0
DO CASE
CASE cType == 'N'
nLen := oQry:FieldLen( nCol )
nDec := oQry:FieldDec( nCol )
oCol:cEditPicture := NumPict( nLen, nDec, .F., .f. )
CASE cType == 'C'
nLen := MIN( 100, oQry:FieldLen( nCol ) )
CASE cType == 'M'
nLen := MIN( 100, Len(AllTrim(oQry:FieldGet( nCol ))) )
nLen := IF(nLen < 30, 30, nLen )
CASE cType == 'D'
nLen := 8
oCol:nHeadStrAlign := 2
oCol:nDataStrAlign := 0
CASE cType == 'D'
nLen := 1
OTHERWISE
// just in case. this will not be executed
oCol:bEditValue := { || "..." }
ENDCASE
oCol:bEditValue := { || oQry:FieldGet( nCol ) }
//oCol:cDataType := If( cType == nil, 'C', cType )
//oCol:bOnPostEdit := { |o,x,n| If( n == VK_RETURN, oBrw:onedit( o, x, n, cType, nCol ), NIL ) }
RETURN oCol