Soporte a mariaConnect ?

Soporte a mariaConnect ?

Postby russimicro » Tue Nov 19, 2024 5:18 pm

Buen dia...

Requiero soporte a la lib mariaConnect...

Existe un parámetro o opción para que los métodos
...
oRs:Append( { "name", "salary" }, { "Anderson", 30000 } )
METHOD Update( aFields, aValues ) --> lSuccess
METHOD Delete() --> lSuccess
METHOD Zap()

no afecten a la base de datos.. que solo solo afecten al recordSet---


La idea es usar bien sea un objeto TArrayData() o RowSet() para migrar de dbf a mysql--- pero poder usar este recordSet como una tabla temporal...
con TArrayData() no funciona el SetOrder(multiples columnas) , el resto me sirve todo,, y con RowSet() , me funciona el setOrder(mutiples tablas), pero no puedo usar el objeto como un temporal (crud) y no afectar la base de datos !!



Gracias

Jonsson Russi
russimicro
 
Posts: 262
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Soporte a mariaConnect ?

Postby Armando » Tue Nov 19, 2024 6:12 pm

Jhonsson:

Podría servirte crear una TABLA temporal?, es prácticamente lo mismo que un array.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3242
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Soporte a mariaConnect ?

Postby russimicro » Tue Nov 19, 2024 7:52 pm

Buena tarde...

Si con tabla ya la tengo... estoy es en proceso de validación y pruebas de 3 formas de recibir las consultas sql y manipular estos datos : dbf, TArrayDatay rowSet...

Cada uno con ventajas y desventajas.. lo más fácil ha sido tablas dbf, pero en busca de solucionar uno de mis problemas actuales con tablas (cierre esporádicos sin explicación lógica), estoy explorando las
otras dos formas... Gracias.. Ahora si el rowSet ... no lo permite,, seria una opcion a desarrollar... o ver si el objeto recordSet de otras librerias como HDO de mauel expósito lo permite..

Otro requerimiento para mariaConnect, es el manejo que hace de los campos lógicos : 1 o 0,,, teniendo que hacer control para el equivalente en dbf (true o false) o viceversa..

Jonsson Russi
russimicro
 
Posts: 262
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Soporte a mariaConnect ?

Postby russimicro » Tue Nov 19, 2024 8:08 pm

Lo que percibo de rowSet, es que está orientado a las operaciones CRUD directamente a la base datos... es ahí donde difiere de la lógica que usamos con objetos en memoria tipo, array, json , hash, etc, para manejar datos recuperados en sistemas sql : requestApi,,, donde estos objetos en memoria los manipulamos, y ya en otra lógica afectamos a la base de datos...

Ejp : ojeto:zap()... se elimina la tabla... en la logica... un zap sobre datos reales, es un caso muy especial y de mucho control... pero un zap sobre temporales si es muy usuado... se prepararán los datos temporales (delete, zap, append, update) y ya con este resultado veo como afecto mi base de datos
russimicro
 
Posts: 262
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Soporte a mariaConnect ?

Postby leandro » Wed Nov 20, 2024 3:47 pm

russimicro wrote:Buena tarde...

Si con tabla ya la tengo... estoy es en proceso de validación y pruebas de 3 formas de recibir las consultas sql y manipular estos datos : dbf, TArrayDatay rowSet...

Cada uno con ventajas y desventajas.. lo más fácil ha sido tablas dbf, pero en busca de solucionar uno de mis problemas actuales con tablas (cierre esporádicos sin explicación lógica), estoy explorando las
otras dos formas... Gracias.. Ahora si el rowSet ... no lo permite,, seria una opcion a desarrollar... o ver si el objeto recordSet de otras librerias como HDO de mauel expósito lo permite..

Otro requerimiento para mariaConnect, es el manejo que hace de los campos lógicos : 1 o 0,,, teniendo que hacer control para el equivalente en dbf (true o false) o viceversa..

Jonsson Russi


Jonsson buenos días como estas?

No sería mejor que usaras los hash? creo que es una solución poderosa y fácil de implementar.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Soporte a mariaConnect ?

Postby russimicro » Wed Nov 20, 2024 11:50 pm

Buena tarde...

Las soluciones usadas hasta ahora.. tablas, TarrayData y rowSet... tienen metodos de navegacion y ordenaminento,,,,

Navigation:
Supports all methods of TDatabase like GoTop,GoBottom,GoTo,Skip,Eof,Bof,LastRec,
RecCount,KeyCount,KeyGoTo, etc
Also supports aliased methods compatible with ADO
MoveFirst,MoveLast,Move,BookMark,AbsolutePosition, etc

La técnica que estoy usando para no cambiar mucho código es .. simular el dbsetorder y dbseek con los objetos mencionados...
con tablas temporales ya esta ok, con tarrayData solo falta el SetOrder(multiples columnas) ,, y como ultima opción use el rowSet (la navegación y el setOrder .. están ok),, pero mariaConnect... los trata como un espejo de la tabla sql... lo actualiza en línea ... no me
sirve para manejo de temporales o primera consulta sql.

y asi los he usado con eagle1-... con hash tendria que desarrollarlos...

Uso los hash pero para procesos tipo variable : almacenar y recuperar un valor ... junto con json...


ejp. de un objeto tipo recordSet :
Code: Select all  Expand view  RUN



FUNCTION objectoSqlFwToDbf(oObjSql,cAliTab,cPatDes,cFilDes,lAbrTab)


    LOCAL nNroCam := 0, II := 0 , nNroReg := 0
    LOCAL cAliTem := "ART_XXX"
    IF lAbrTab == NIL
       lAbrTab := .T.
    ENDIF

    IF lAbrTab //
       ABRETABLA(cAliTab)
       COPY_STRUC_A_DBF(cAliTab,cPatDes+cFilDes,"DBFCDX")
       CLOSE (cAliTab)

       IF !lUsaTab(cPatDes,cFilDes,cAliTem,{},.F.,NIL,"DBFCDX")
          RETURN .F.
       ENDIF

    ELSE  // YA VIENE ABIERTA
       cAliTem := cAliTab  // LA TEMPORAL ES LA QUE VIENE
    ENDIF

    nNroReg := oObjSql:RecCount()

    oObjSql:GoTop()
    nNroCam := oObjSql:Fcount()

    FOR II := 1 TO nNroReg

        SELECT (cAliTem)
        IF (cAliTem)->( lReglock( .T. ) )
           IF !__CREA_REG_DBF_OF_SQL(nNroCam,cAliTem,oObjSql)
              RETURN .F.
           ENDIF
        ENDIF

        oObjSql:Skip( 1 )

    NEXT II

    (cAliTem)->( DBCOMMIT() )
    (cAliTem)->( DBUNLOCK() )

    IF lAbrTab
       CLOSE (cAliTem)
    ENDIF

RETURN .T.

//*****************************************************************

FUNCTION __CREA_REG_DBF_OF_SQL(nNroCam,xAliTab,oSqlTab)

LOCAL nPosCam, J := 0, cTipDat, xConCam


TRY
        FOR J := 1 TO nNroCam

            nPosCam := (xAliTab)->( FIELDPOS( oSqlTab:fieldname( J ) ) )

            IF nPosCam > 0

               cTipDat := (xAliTab)->( VALTYPE( &( FIELDNAME( nPosCam ) ) ) )

               IF !EMPTY(oSqlTab:FieldGet( J ) )

                   DO CASE
                      CASE cTipDat == "N"
                           xConCam :=  oSqlTab:FieldGet( J )
                      CASE cTipDat == "D"

                           xConCam := oSqlTab:FieldGet( J )

                      CASE cTipDat == "M"

                      CASE cTipDat == "C"
                           xConCam :=  IF(oSqlTab:FieldGet( J )==NIL,"",oSqlTab:FieldGet( J ) )
                           // OJO REVISAR LONGITUD
                      CASE cTipDat == "L"
                           xConCam :=  IF(oSqlTab:FieldGet( J )=="1",.T.,.F.)
                      OTHERWISE
                           ALERT("Error. Tipo de dato desconocido")
                   ENDCASE

                   (xAliTab)->( FIELDPUT(nPosCam, xConCam)  )

               ENDIF

            ENDIF

        NEXT J
CATCH

       RETURN .F.
END

RETURN .T.

 
russimicro
 
Posts: 262
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Soporte a mariaConnect ?

Postby russimicro » Thu Nov 21, 2024 5:45 pm

Buena tarde.

He implementado de manera básica el método de ordenamiento de múltiples columnas en la clase TarrayData, pero sé que ese puede optimizar,
y también nos dice Mr. Rao,, que ya se implementó en la clase Maria_connect ( metodo osql:rowset( cSenEje ):SetOrder(multiplesColumnas).

Con esta solución ya soluciono el manejo de RecordSet desde mariaConnect --- pero con objetos locales tipo TarrayData:new()

Favor revisar codigo para optimizar o si Mr Rao,, nos comparte la solucion que el dio en mariaConnect

ver metodo : METHOD criterioOrdenamiento(cSarOrd,X,Y,lDesc) CLASS TArrayData

Grcias

Code: Select all  Expand view  RUN



METHOD SetOrder( nFld, u, lDesc ) CLASS TArrayData

   local uBm
   local xCodBus := nFld
   local cConIzq,cConDer

   DEFAULT nFld := ::nOrder

   ( u )

   if PCount() > 0
      if Empty( nFld )
         if ::nSrcType > SRC_ARR
//            ASort( ::aData, 1, ::KeyCount(), { |x,y| ABS( x[ ::nRecNumCol ] ) < ABS( y[ ::nRecNumCol ] ) } )
            ASort( ::aData, 1, ::KeyCount(), { |x,y| ::RecID( x ) != ::nAppendRec .and. ::RecID( x ) < ::RecId( y )  } )
         elseif ::aNatural != nil
            uBm   := ::BookMark
            ACopy( ::aNatural, ::aData )
            ::lDesc     := .f.
            ::BookMark  := uBm
         endif
      else
         if ValType( nFld ) == 'C'
            nFld    := ::FieldPos( nFld )
         endif

         if nFld > 0

            DEFAULT lDesc  := .f.

            if ::KeyCount() > 0

               uBm   := ::BookMark
               if ::FieldType( nFld ) == 'C'
                  if lDesc
                     ASort( ::aData, 1, ::KeyCount(), { |x,y| ::RecID( x ) != ::nAppendRec .and. Upper( x[ nFld ] ) > Upper( y[ nFld ] )} )
                  else
                     ASort( ::aData, 1, ::KeyCount(), { |x,y| ::RecID( x ) != ::nAppendRec .and. Upper( x[ nFld ] ) < Upper( y[ nFld ] ) } )
                  endif
               else
                  if lDesc
                     ASort( ::aData, 1, ::KeyCount(), { |x,y| ::RecID( x ) != ::nAppendRec .and. x[ nFld ] > y[ nFld ] } )
                  else
                     ASort( ::aData, 1, ::KeyCount(), { |x,y| ::RecID( x ) != ::nAppendRec .and. x[ nFld ] < y[ nFld ] } )
                  endif
               endif
               ::BookMark  := uBm
            endif

            ::nOrder := nFld
            ::lDesc  := lDesc

         else

            DEFAULT lDesc  := .f.

            if ::KeyCount() > 0

               uBm   := ::BookMark

                 ASort( ::aData, 1, ::KeyCount(), { |x,y| ::RecID( x ) != ::nAppendRec .and. ::criterioOrdenamiento(xCodBus,X,Y,lDesc)   } )

               ::BookMark  := uBm
            endif

            ::nOrder := nFld
            ::lDesc  := lDesc


         endif
      endif
   endif

return If( ::nOrder > 0, ::FieldName( ::nOrder ), "" )

//********************************************************************

METHOD criterioOrdenamiento(cSarOrd,X,Y,lDesc)  CLASS TArrayData

LOCAL I := 0
LOCAL cSarIzq := "" , cSarDer := "" , cNomCam := ""

FOR I := 1 TO LEN(cSarOrd)
    IF cSarOrd[I] == "," .OR. I == LEN(cSarOrd)
       IF I == LEN(cSarOrd)
          cNomCam += cSarOrd[I]
       ENDIF

       nNroCol :=  ::FieldPos( cNomCam )
       cNomCam := ""

       cSarIzq += x[nNroCol] // +IF(I<LEN(cSarOrd),"+","")
       cSarDer += y[nNroCol]  //"+IF(I<LEN(cSarOrd),"+","")
    ELSE
       cNomCam += cSarOrd[I]
    ENDIF

NEXT I

IF lDesc
   RETURN UPPER(cSarIzq) > UPPER(cSarDer)
ELSE
   RETURN UPPER(cSarIzq) < UPPER(cSarDer)
ENDIF

RETURN .T.

 
russimicro
 
Posts: 262
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Soporte a mariaConnect ?

Postby Antonio Linares » Fri Nov 22, 2024 6:04 am

Estimado Johnson,

Quedamos a la espera de la respuesta de Mr. Rao
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Soporte a mariaConnect ?

Postby nageswaragunupudi » Fri Nov 22, 2024 12:02 pm

We can use RowSet in Batchmode.

Code: Select all  Expand view  RUN
oRs := oCn:RowSet( .......... )
oRs:SetBachMode( .t. )
// check
? oRs:lBatchMode // --> .t.


In batch mode, all appends, edits and deletions are only in memory and do not make any changes to the underlying table in the database.

Later when we want to save all the changes made
Code: Select all  Expand view  RUN
oRs:SaveBatch()

or to ignore all changes and restore the original table to the RowSet()
Code: Select all  Expand view  RUN
oRs:CancelBatch()


Batch mode continues till we reset.
Code: Select all  Expand view  RUN
oRs:SetBatchMode( .f. )


IMPORTANT CAUTION:
Even in lBatchMode, METHOD Zap() really Zaps the table in the database.
Please do not use it.

So for your requirements use BatchMode
Code: Select all  Expand view  RUN
oRs := oCn:RowSet( ........... )
oRs:SetBatchMode( .T. )

// do all your work of appends/deletes/updates
// and finally
oRs:Close()


Please let me know if this is enough for your requirements.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10690
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Soporte a mariaConnect ?

Postby russimicro » Fri Nov 22, 2024 2:15 pm

Buen día... Mr. Rao

Quedo pendiente..

Nota : Observación para quienes están empezando a trabajar con sql y mariaConnect

La clase TarrayData es muy útil a la hora de trabajar con las respuestas sql : oCon:Execute()
permite cargar el result, en este objeto de memoria y operarlo (CRUD), sin afectar la base de datos... permite operaciones como : filtrar, ordenar , navegar, etc---

Ejp:
Code: Select all  Expand view  RUN


                 oRs := TArrayData():NEW(oConSql,LOWER(cNomTab),cSqlFil)   // cargado con una Sentencia Sql directamente

                 oRs := TArrayData():NEW(cAliTab)   // cargado desde un tabla DBF

                 oRs:fromDBF("TAB_TEM")

                ejp : oRs:zap()
           
                aData    := oConSql:Execute( cSenEje )

                IF LEN(aData) == 0
                    //ALERTX("Aviso. Resultado de la consulta SQL es vacia "+cSenEje)
                    RETURN .F.
                 ENDIF

                 FOR J := 1 TO LEN(aData)
                     AADD(aData[J],"")
                     oRs:Append( aData[J] )
                 NEXT J
 
russimicro
 
Posts: 262
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Soporte a mariaConnect ?

Postby nageswaragunupudi » Fri Nov 22, 2024 3:13 pm

Armando wrote:Jhonsson:

Podría servirte crear una TABLA temporal?, es prácticamente lo mismo que un array.

Saludos

If I remember right, you are working with MSSQL and ADO. Am I right?
May I know why are you interested in temporary tables of MySQL?

FWmaria lib provides functions for creation of tables both normal and temporary and we can also create directly with SQL.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10690
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Soporte a mariaConnect ?

Postby nageswaragunupudi » Fri Nov 22, 2024 3:32 pm

Buen día... Mr. Rao

Quedo pendiente..

Nota : Observación para quienes están empezando a trabajar con sql y mariaConnect

La clase TarrayData es muy útil a la hora de trabajar con las respuestas sql : oCon:Execute()
permite cargar el result, en este objeto de memoria y operarlo (CRUD), sin afectar la base de datos... permite operaciones como : filtrar, ordenar , navegar, etc---


FWH provides many tools. You may use what is best suited for your purpose.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10690
Joined: Sun Nov 19, 2006 5:22 am
Location: India


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 94 guests