Soporte a mariaConnect ?

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

Soporte a mariaConnect ?

Post by russimicro »

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
User avatar
Armando
Posts: 3247
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Soporte a mariaConnect ?

Post by Armando »

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

Re: Soporte a mariaConnect ?

Post by russimicro »

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 _ 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 ?

Post by russimicro »

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
User avatar
leandro
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Soporte a mariaConnect ?

Post by leandro »

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 _ 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) ]
russimicro
Posts: 262
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Soporte a mariaConnect ?

Post by russimicro »

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



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 _, J := 0, cTipDat, xConCam


TRY
        FOR J := 1 TO nNroCam

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

            IF _ > 0

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

               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(_, 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 ?

Post by russimicro »

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



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.

 
User avatar
Antonio Linares
Site Admin
Posts: 42252
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Soporte a mariaConnect ?

Post by Antonio Linares »

Estimado Johnson,

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

Antonio Linares
www.fivetechsoft.com
User avatar
nageswaragunupudi
Posts: 10691
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: Soporte a mariaConnect ?

Post by nageswaragunupudi »

We can use RowSet in Batchmode.

Code: Select all | Expand

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

oRs:SaveBatch()
or to ignore all changes and restore the original table to the RowSet()

Code: Select all | Expand

oRs:CancelBatch()
Batch mode continues till we reset.

Code: Select all | Expand

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

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

Re: Soporte a mariaConnect ?

Post by russimicro »

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


                 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
 
User avatar
nageswaragunupudi
Posts: 10691
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: Soporte a mariaConnect ?

Post by nageswaragunupudi »

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: 10691
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: Soporte a mariaConnect ?

Post by nageswaragunupudi »

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
Post Reply