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: 260
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: 3226
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: 260
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: 260
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: 1676
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



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: 260
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



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: 260
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 23 guests