Page 2 of 3

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 9:39 am
by Joaquim Ferrer
La linea 5962 llama a RuntimeErr
Code: Select all  Expand view

      If ::LineCount(.F.) == -1
         ::lOpened := .F.
         ::RuntimeErr( "27", SR_Msg(27) , 2, EG_OPEN, ESQLRDD_OPEN )
         Return Self
      EndIf
 


el codigo de LineCount
Code: Select all  Expand view

METHOD LineCount( lMsg ) CLASS SR_WORKAREA

   Local nRet := 0, aRet := {}

   DEFAULT lMsg := .T.

   If ::lISAM

      If nLineCountResult == 0
         Switch ::oSql:nSystemID
         Case SYSTEMID_POSTGR
            ::oSql:exec("SELECT " + SR_DBQUALIFY( ::cRecnoName, SYSTEMID_POSTGR) + " FROM " + ::cQualifiedTableName + " ORDER BY " + SR_DBQUALIFY( ::cRecnoName, ::oSql:nSystemID ) + " DESC LIMIT 1" + iif(::oSql:lComments, " /* Counting Records */", ""), lMsg, .t., @aRet)
            Exit
         Case SYSTEMID_FIREBR
            ::oSql:exec("SELECT gen_id("+::cFileName+",0) FROM RDB$DATABASE", .F., .T., @aRet)
            Exit
         Case SYSTEMID_CACHE
            ::oSql:exec("SELECT TOP 1 " + SR_DBQUALIFY(::cRecnoName, SYSTEMID_CACHE) + " FROM " + ::cOwner + ::cFileName + " ORDER BY " + SR_DBQUALIFY( ::cRecnoName, ::oSql:nSystemID ) + " DESC", lMsg, .t., @aRet)
            Exit
         Default
           ::oSql:exec("SELECT MAX( " + SR_DBQUALIFY( ::cRecnoName, ::oSql:nSystemID ) + " ) FROM " + ::cQualifiedTableName + iif(::oSql:lComments, " /* Counting Records */", ""), lMsg, .t., @aRet)
         End

         If Len(aRet) > 0 .and. valtype(aRet[1,1]) != "N"
           ::oSql:exec("SELECT COUNT( " + SR_DBQUALIFY( ::cRecnoName, ::oSql:nSystemID ) + " ) FROM " + ::cQualifiedTableName + iif(::oSql:lComments, " /* Counting Records */", ""), lMsg, .t., @aRet)
         EndIf

         If Len(aRet) > 0
            ::aInfo[ AINFO_RCOUNT ] := aRet[1,1]
            nRet := aRet[1,1]
         ElseIf ::oSql:nRetCode != SQL_SUCCESS .and. ::oSql:nRetCode != SQL_NO_DATA_FOUND
            nRet := -1     // Error
         EndIf
      Else
         nRet := nLineCountResult
         ::aInfo[ AINFO_RCOUNT ] := nRet
      EndIf
   Else
      nRet := len(::aCache)
   EndIf

   If Empty(nRet)
      ::lEmptyTable           := .T.
      ::aInfo[ AINFO_RECNO ]  := 1
      ::aInfo[ AINFO_RCOUNT ] := 0
      ::aInfo[ AINFO_BOF ]    := .T.
      ::aInfo[ AINFO_EOF ]    := .T.
   EndIf

Return nRet
 


Podria ser que no entrara a la consulta por el tema de ::lISAM, mi base de datos es innoDb, lo que no entiendo es que las tablas creadas con SQLRDD tambien son innoDB y funcionan

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 10:58 am
by Joaquim Ferrer
Si utilizo directamente la consulta, sin USE ... VIA SQLRDD...

Code: Select all  Expand view

   oSql:= SR_GetConnection()
   oSql:Exec("select * from customer",, .T., @aRows )
   ? oSql:GetAffectedRows()

   ? valtype(aRows), len(aRows)
   ? valtype(aRows[1])

   for each a in aRows
      for each i in a
         ?? i
      next
      ?
   next
 


Se muestran correctamente los registros
Code: Select all  Expand view

Taouk               Dockett             24636 Golden Springs Rd       Princeton                     NH51508-620307/05/90 00:00:00.000.F.         27     23300.0000000000000000000000000000000This is a test for record 492

Mario               French              18139 Hewes Street            Williston                     HI28288-220308/08/83 00:00:00.000.T.         46     55300.0000000000000000000000000000000This is a test for record 493

Gary                Beilharz            16861 Abbots Place            Amerspoort                    WI79471-858301/30/91 00:00:00.000.F.         67    144000.0000000000000000000000000000000This is a test for record 494

Guy                 Acker               27636 Broadway                Framingham                    AK84142-806905/20/89 00:00:00.000.T.         48     39300.0000000000000000000000000000000This is a test for record 495

Dickson             Valle               32693 Stonecutter Lane        Kowloon Bay                   AL18415-926307/14/91 00:00:00.000.F.         87     42200.0000000000000000000000000000000This is a test for record 496
 


Otra forma que también funciona :
Code: Select all  Expand view

   dbUseArea( .F., "SQLRDD", "select * from customer", "customer" )
   ? customer->FIRST
   WAIT
   browse()
 


Pero sigue sin funcionar si la tabla no se ha creado desde SQLRDD, la unica forma es la anterior
Code: Select all  Expand view

USE "customer" NEW VIA "SQLRDD"
 

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 11:42 am
by Joaquim Ferrer
Descubierto el misterio ...

Si queremos abrir una tabla con USE cTable VIA SQLRDD, que no haya sido creada con el RDD, tendremos que modificar la estructura y añadir un campo en dicha tabla
Code: Select all  Expand view

    `sr_recno` BIGINT(20) NOT NULL AUTO_INCREMENT, UNIQUE INDEX `sr_recno` (`sr_recno`) USING BTREE
 


Las tablas creadas por SQLRDD via dbCreate(...) ya añaden de forma automática sr_recno, como he mencionado anteriormente, por lo que no fallará USE cTable VIA SQLRDD

Si no se desea modificar la estructura, siempre se puede utilizar dbUseArea( .F., "SQLRDD", "select * from customer", "customer" )

En conclusión, si se pretende migrar todo un sistema de tablas DBF a una BD SQL es mejor crear las tablas con DbCreate utilizando SQLRDD y posteriormente añadir los registros

Entendiendo un poco como funciona SQLRDD, creo que puede ser realidad el paso de paradigma DBF a SQL
sin tocar una línea de código
... veremos :)

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 12:44 pm
by Antonio Linares
Excellente !!! :-D

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 2:39 pm
by Carles
Quim

Joaquim Ferrer wrote:Descubierto el misterio ...


Las frescas noches de verano te ayudan a resolver.... :lol:

Congratulations.
C.

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 3:35 pm
by Joaquim Ferrer
Gràcies Carles !!!

Como dijo aquel... las neuronas estan fritas, pero la barbacoa está rica :)

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 4:15 pm
by wilsongamboa
Joaquim buenos dias
podrias actualizar https://github.com/QuimFerrer/sqlrdd.git por favor con tus avances
gracias por tu ayuda

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 5:02 pm
by Joaquim Ferrer
Repositorio actualizado !

Estaria bien compartir experiencias :)

wilsongamboa wrote:Joaquim buenos dias
podrias actualizar https://github.com/QuimFerrer/sqlrdd.git por favor con tus avances
gracias por tu ayuda

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 5:56 pm
by wilsongamboa
Joaquim gracias mira esto tengo
c:\demo\sqlrddq>hbmk2 project.hbp
prg\demo01.prg(8) Error F0029 Can't open #include file 'myconn.ch'
hbmk2: Error: Running Harbour compiler (embedded). 1
(c:\hbb\bin\harbour.exe) -n2 prg\demo01.prg -n -q0 -DHBMK_HAS_HBCT=1 -DHBMK_HAS_
HBTIP=1 -DHBMK_HAS_HBFSHIP=1 -DHBMK_HAS_HBXPP=1 -DHBMK_HAS_HBWIN=1 -DHBMK_HAS_XH
B=1 -oC:\Users\gussw\AppData\Local\Temp\hbmk_yolxxb.dir\ -ic:\bcc7\Include -ic:\
bcc7\Include\dinkumware -ic:\bcc7\Include\windows\crtl -ic:\bcc7\Include\windows
\rtl -ic:\bcc7\Include\windows\sdk -ic:\hbb\include -iinclude -ic:\hbb\contrib\x
hb -ic:\hbb\contrib\hbct -ic:\hbb\contrib\hbtip -ic:\hbb\contrib\hbfship -ic:\hb
b\contrib\hbxpp -ic:\hbb\contrib\hbwin -u+c:\hbb\contrib\hbwin\hbwin.ch

saludos
Wilson
creo falta ese archivo myconn.ch

Re: Incluyendo el SQLRDD

PostPosted: Thu Aug 24, 2023 6:00 pm
by wilsongamboa
mi experiencia
intente cuando apenas salio este producto pero me fallaba cuando hacia use \sistemas\siste001\empre001\ventas\ventas.dbf index \sistemas\siste001\empre001\ventas\ventas.ntx alias ventas
intente con una funcion que ellos tenian para estos casos pero no me funciono
hasta alli llegue eso unido a mis escasos conocimientos de sql en esa epoca ( y ahora ) me detuvieron no me atrevi a comprar la lib por mi falta de conocimiento del campo sql
saludos
wilson
pd: me cai del asiento cuando vi que estaban disponibles los fuentes ja ja ja
gracias a don Marcelo Lombardo y al equipo de xharbour.com !!

Re: Incluyendo el SQLRDD

PostPosted: Fri Aug 25, 2023 1:19 am
by Jimmy
hi,

under SQL you need a UNIQUE "Identifier" like RECNO() under DBF

Fivewin seems to use "ID" and Xbase++ "__Record" as PRIMARY KEY
SQLRDD use "sr_recno" so everybody can use a other "Identifier"

it is recommend to use "Import" Function which include PRIMARY Key for those SQL Table

Re: Incluyendo el SQLRDD

PostPosted: Fri Aug 25, 2023 1:33 am
by carlos vargas
SR_RecnoName()
Returns the name of the column that stores the Recno()

› Syntax


SR_RecnoName( [<cName>] ) ==> cOldSet


› Arguments



<cName> Column name to manage the Recno().




› Return


Returns the status that was current before SR_RecnoName() was called.


› Description


Returns the name of the column that manages the Recno(). By default, the SQLRDD adopts the name SR_RECNO. If you want to use another name, call SR_RecnoName("NAME") before dbUseArea() or dbCreate().
This function is also very useful when we want to open tables not created by SQLRDD, but we can use another auto sequenced numeric column for this purpose.


› Examples


SR_RecnoName( "CAMPO1" )
USE TABELA1 // will use the field COMPO01 as recno(). If this field does not exist, it will generate a runtime error.

Re: Incluyendo el SQLRDD

PostPosted: Fri Aug 25, 2023 1:34 am
by carlos vargas
SR_DeletedName()
Returns the name of the column that manages the Deleted() status

› Syntax


SR_DeletedName( [<cName>] ) ==> cOldSet


› Arguments



<cName> Name column to manage the Deleted() status.




› Return


Returns the status that was current before SR_DeletedName() was called.


› Description


Returns the name of the column that manages the Deleted() status. By default, the SQLRDD adopts the name SR_DELETED. If you want to use another name, call SR_DeletedName("NAME") before dbUseArea() or dbCreate().
This function is also very useful when we want to open tables not created by SQLRDD, but we can use another not null character column for that purpose.

Re: Incluyendo el SQLRDD

PostPosted: Fri Aug 25, 2023 1:35 am
by carlos vargas
se necesita además un campo para controlar el borrado de fila, por defecto es sr_deleted

Re: Incluyendo el SQLRDD

PostPosted: Fri Aug 25, 2023 6:56 am
by Joaquim Ferrer
wilsongamboa wrote:Joaquim gracias mira esto tengo
c:\demo\sqlrddq>hbmk2 project.hbp
prg\demo01.prg(8) Error F0029 Can't open #include file 'myconn.ch'
hbmk2: Error: Running Harbour compiler (embedded). 1
(c:\hbb\bin\harbour.exe) -n2 prg\demo01.prg -n -q0 -DHBMK_HAS_HBCT=1 -DHBMK_HAS_
HBTIP=1 -DHBMK_HAS_HBFSHIP=1 -DHBMK_HAS_HBXPP=1 -DHBMK_HAS_HBWIN=1 -DHBMK_HAS_XH
B=1 -oC:\Users\gussw\AppData\Local\Temp\hbmk_yolxxb.dir\ -ic:\bcc7\Include -ic:\
bcc7\Include\dinkumware -ic:\bcc7\Include\windows\crtl -ic:\bcc7\Include\windows
\rtl -ic:\bcc7\Include\windows\sdk -ic:\hbb\include -iinclude -ic:\hbb\contrib\x
hb -ic:\hbb\contrib\hbct -ic:\hbb\contrib\hbtip -ic:\hbb\contrib\hbfship -ic:\hb
b\contrib\hbxpp -ic:\hbb\contrib\hbwin -u+c:\hbb\contrib\hbwin\hbwin.ch

saludos
Wilson
creo falta ese archivo myconn.ch


Wilson, crea el archivo /include/myconn.ch y le añades
Code: Select all  Expand view

#define __DB__    "mi base de datos"
#define __PWD__   "mi password"