como usar SQLRDD y no morir en el intento

Post Reply
devtuxtla
Posts: 392
Joined: Tue Jul 29, 2008 1:55 pm

como usar SQLRDD y no morir en el intento

Post by devtuxtla »

Para The FuLL

Este es un pequeño ejemplo funcional, de hecho es el cascaron de mi aplicacion del lado del server.

Mi aplicacion es WEB por obvias razones debe ser mas robusta que una aplicacion que trabaje en LAN

NO intento crear polemica, ya que he leido en el foro que a muchos no les va bien con SQLRDD.
Del soporte sobre SQLRDD lo he utilizado dos veces y Patrick Mask me ha ayudado

NO les recomiendo la version de evaluacion de SQLRDD - NO SIRVE . Si decides utilizar SQLRDD, te recomiendo que lo compres.

Esta es mi personal punto de vista y es tan valida como la de ustedes.

Les prepare un diagrama funcional de como usar SQLRDD con una aplicacion escrita para xBase.
http://rapidshare.com/files/12044254/Transaccion.pdf

Este es el codigo que utiliza una conexion a MySQL, para entender, como se se utiliza SQLRDD
http://rapidshare.com/files/3222324973/ServerSQL.PRG


Espero que les sirva.

Saludos
:D
Visite Chiapas, el paraiso de México.
User avatar
Antonio Linares
Site Admin
Posts: 42655
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 67 times
Been thanked: 96 times
Contact:

Re: como usar SQLRDD y no morir en el intento

Post by Antonio Linares »

Gustavo (?),

Si no tienes inconveniente, copio aqui el contenido de lo que has compartido, para que no se pierda. gracias :-)

Image
Image
Image

serverSQL.prg

Code: Select all | Expand

/*----------------------------------------------------       |
* Función:         Programa Principal del serverSQL
-----------------------------------------------------*/


#Include "FiveWin.Ch"
#Include "BtnGet.Ch"
#Include "Image.Ch"
#Include "SSay.Ch"
#include "error.ch"
#Include "SQLRDD.Ch"
#Include "MySQL.Ch"

#Define ST_ZOOMED   2
#Define CLR_WINDOW 16
#define NTRIM(n)    ( LTrim( Str( n ) ) )

#define SIZE_INIT      NIL
#define SIZE_RESTORED  0
#define SIZE_MINIMIZED 1
#define SIZE_MAXIMIZED 2

REQUEST  DbfCDX, DbfFpt  
REQUEST  SQLRDD, SR_MYSQL, SR_ODBC, SR_PGS  
EXTERNAL OrdKeyCount, OrdKeyGoTo, OrdKeyNo
EXTERNAL DBPACK, DBZAP

static oTray, oIcon, nSizeType

//--- Rutina Principal ------------------------------------------------------

*--------------------------------------------------------------*
FUNCTION SERVERPyME(_SETINI, _TIPC, _COPIAPEN, _POS, _SQUEMA)
*--------------------------------------------------------------*
   PUBLIC hRec, dDate, cIni, cDir, cPrt, oBtn, cSnds, cNomemp, cNumempre:=0, PcName:=Space(50), nEmpresa:=0, VtaMayoreo:= .F., _CAMBIOURGENTE:=.F.
   PUBLIC oBar, oIcon, nClr, cFntW, oFont, lMod:=.F., aDbfs,  _VER_POS:="  VER: 5.3u 04 de Marzo del 2013", _VERSION:="5.3u", _ULTVERSION:="5.3u"
   PUBLIC cConn, cDriver, cTipocom:=_TIPC, oRlj
   PUBLIC oBmp, cBmp, aEje, oEje, cUAct, lInit
   PUBLIC TRA_NUMTRA:=0, ODTRA, ODTRD
   // datos para el server
   PUBLIC aData , nMain, nData, oItemMian, oBtnsMain, cShema, lEventoActivo:=.F., oTimer, lFinalizaAplicacion:= .F., cTitulo:=""
   PUBLIC cUTem, cData, cPar:="/SQL/L", SetINI:=".\", __ACTVER:="", CDXRDD:="DBFCDX", P_oMSG:=NIL, P_ELMSG:="", P_oPREV, oWseguimiento
   PUBLIC cMain, cDBMS, cHost:= "
LAN", cUsID, cPsID, oConn, oConx ,oConempx, cIPExternal:="", IPRemoteServer:="", cUserdir:="", oPosCon:=NIL

   // Variables para la conexion a la Base de Datos
   PUBLIC nCnxPrs,nCnxRmt, nCnxCrp
   PUBLIC aCnxRmt,nCnx
   PUBLIC xCnxLAN,nCnxCrp
   PUBLIC n_Err, lTdsEmp:=.F.
   PUBLIC _SOLOLOCAL:=.F., OTIME, nPOSLIN:=0
   PUBLIC cFormaPagoObligatoria:="
NO", USR_PUEDOAUTORIZAR:=.F., aAlumnos:={}

   
   ** OBJETOS DE TABLAS
   PUBLIC oDmsgs
   ** COLOR DE LOS BROWSES
PUBLIC nClrBlack:=nRGB( 000,000,000 )    //CLR_BLACK
PUBLIC nClrWhite:=nRGB( 255,255,255 )    //CLR_WHITE
PUBLIC nClrYello:=nRGB( 255,255,000 )    //CLR_YELLOW
PUBLIC nClrGreen:=nRGB( 133,150,086 )    //CLR_NGREEN
PUBLIC nClrVerde:=nRGB( 128, 255, 128 )  //NCOLOR4
PUBLIC nClrRojo :=nRGB( 255,  98, 098 )  //NCOLOR7
PUBLIC nClrAzAma:=nRGB( 128, 128, 255 )  //NCOLOR9
PUBLIC nClrAzAgu:=nRGB( 064, 200, 200 )  //NCOLOR10
PUBLIC nClrCafeC:=nRGB( 180, 120, 120 )  //NCOLOR11
PUBLIC nClrVerdA:=nRGB( 214, 250, 137 )  //

   ** COLOR DE LOS BROWSES
PUBLIC CLR_PINK:= nRGB( 255, 128, 128 )
PUBLIC CLR_NBLUE:=nRGB( 128, 128, 192 )
PUBLIC CLR_TEST:=nRGB(89,117,191)//(109,189,91)//(225,216,96)//(156,192,129)//(185,136,182)//( 124, 197, 173 ) //( 125, 169, 196 )
PUBLIC CLR_2TEST:=nRGB(112,158,154)//(118,163,158)
PUBLIC CLR_3TEST:=nRGB(224,207,141)
PUBLIC CLR_4TEST:=nRGB(197,131,90)
PUBLIC CLR_5TEST:=nRGB(130,162,125)
PUBLIC CLR_NBROWN:=nRGB(177,140,99)//( 130, 99, 053 )
PUBLIC CLR_NGREEN:=nRGB(133,150,86)//( 133,150,014 )
PUBLIC CLR_NGRAY:=nRGB( 160, 160, 160 )
PUBLIC CLR_NPINK:=nRGB( 187,0,94 )
PUBLIC CLR_NTERRA:=nRGB( 171,35,16 )
PUBLIC CLR_NMBLUE:=nRGB( 0,0,159 )
PUBLIC CLR_NYELLOW:=nRGB( 255,255,0 )
PUBLIC CLR_BLUEPURE:=nRGB( 000,000,128 )


* Para el manejo de colores
PUBLIC _CGetRFore := RGB( 000, 000, 000 )   && NEGRO        Texto de Get de Lectura
PUBLIC _CGetRBack := RGB( 192, 255, 255 )   && CYAN         Fondo de Get de Lectura
PUBLIC _CGetSFore := RGB( 255, 255, 000 )   && AMARILLO     Texto de Get de escritura ( Read Only )
PUBLIC _CGetSBack := RGB( 128, 128, 128 )   && GRIS         Fondo de Get de escritura ( Read Only )
PUBLIC _CSayFore  := RGB( 255, 000, 000 )   && ROJO         Texto de Say sin caja de captura
PUBLIC _CSayBack  := RGB( 192, 192, 192 )   && BLANCO OPACO Fondo de Say sin caja de captura
PUBLIC _CComboFore:= RGB( 000, 000, 128 )   && AZUL         Frente del ComboBox
PUBLIC _CComboBack:= RGB( 192, 192, 192 )   && BLANCO OPACO Fondo del ComboBox
PUBLIC _CSayFore  := RGB( 255, 000, 000 )   && ROJO         Texto de Say sin caja de captura
PUBLIC _CSayBack  := RGB( 214, 250, 137 )   && VERDE        Fondo de Say sin caja de captura
PUBLIC _CComboFore:= RGB( 000, 000, 128 )   && CYAN CLARO   Frente del ComboBox
PUBLIC _CCheckFore:= RGB( 000, 000, 255 )   && AZUL OBSCURO Frente del ComboBox
PUBLIC _CComboBack:= RGB( 143, 184, 224 )   && AZUL CLARO   Fondo del ComboBox
PUBLIC _CSayBFore := RGB( 000, 000, 255 )   && BLANCO       Texto del say

PUBLIC nColor1, nColor2,nColor3, nColor4,nColor5, nColor6, nColor7, nColor8, nColor9, nColor10, nColor11, nGCLR05, nColor12  
nGCLR05:= nRGB( 223, 207, 207)  //nRGB( 080, 205, 216)
nColor1 := nRGB( 255, 148,  96)   // naranja
nColor2 := nRGB( 255, 255, 128)   // amarillo p lido
nColor3 := nRGB( 255, 128, 128)   // caqui
nColor4 := nRGB( 128, 255, 128)   // verde palido
nColor5 := nRGB( 128, 255, 255)   // azul palido
nColor6 := nRGB( 255, 128, 255)   // lila
nColor7 := nRGB( 255,  98, 098)   // rojo p lido
nColor8 := nRGB( 200, 200, 170)   // color arena
nColor9 := nRGB( 128, 128, 255)   // azul amanecer
nColor10:= nRGB( 184, 245, 245)   // azul aguamarina
nColor11:= nRGB( 180, 120, 120)   // cafe muy claro
nColor12:= nRGB( 255, 255, 210)   // CREMA
PUBLIC nClr000:= nRGB( 000, 000, 000)  // NEGRO
PUBLIC nClrBack:=nRGB( 143, 184, 224)  // AZUL
PUBLIC nClrGet:= nRGB( 208, 225, 242)  // AZUL CLARO

PUBLIC IPWEB:="
127.0.0.1"
PUBLIC Database:="
miDB"
PUBLIC Host:="
localhost"
PUBLIC Username:="
Miusuario"
PUBLIC Password:="
MiPassword"
PUBLIC cMIempresa:="
MI EMPRESA SA DE CV"
SET DELETED ON

   RddSetDefault("
SQLRDD")

   cOldD:="
"
   aMain:={}
   aData:={}
   lSQL:=.T.
   
   SET 3DLOOK ON
   SET DELETED ON
   SET SOFTSEEK OFF
   SET EPOCH TO 1950
   SET DATE FORMAT "
dd/mm/yyyy"
   
   SysRefresh()
   
   // VERIFICA SI LA DIRECCION DEL SERVER CENTRAL ES IGUAL A LA IP DEL SERVER
   
   RddSetDefault("
SQLRDD")
   nConn := SR_AddConnection(CONNECT_MYSQL,"
MYSQL=127.0.0.1;UID=Miusuario;PWD=MiPassword;DTB=miDB")
   nMain := nConn
   oConx := nConn

   SR_SetActiveConnection(nMain)
 
   IF nMain <= 0
      // FIN DE LA NUEVA RUTINA 14 DE JUNIO DEL 2012
      IF nMain <= 0
         MsgStop("
00- No se puede establecer la conexión a " + cMain + CRLF + ;
                 "
NO existe la base de datos MIDB          "  + CRLF + ;
                 "
La clave o la password son incorrectas   " ,"Error...")
         PostQuitMessage(0)
         RETURN -5
      ENDIF
   ENDIF
   
   IF ! SR_EXISTTABLE("
PRINCIPAL")
      MSGSTOP("
LA BASE DE DATOS ESTA INCOMPLETA " + CRLF + ;
              "
NO PUEDO DAR ACCESO A APLICACION ","ERROR...")
      RETURN -6
   ENDIF
    
   SR_SetActiveConnection(nMain)
   
   
   USE ("
PRINCIPAL") ALIAS Control SHARED NEW VIA "SQLRDD"
   IF Control->(LastRec()) = 0
      MSGSTOP("
LA BASE DE DATOS ESTA INCOMPLETA " + CRLF + ;
              "
NO PUEDO DAR ACCESO A APLICACION","ERROR...")
      PostQuitMessage(0)
      RETURN .F.     
   ENDIF
   Control->(DBGOTOP())
   LOCATE FOR ALLTRIM(Control->miempresa ) = cMIempresa
   IF ! Control->(FOUND())  
      DBCLOSEAREA("
Control")
      MSGSTOP("
SER003 NO Existe el Registro de miempresa","Error...")
      PostQuitMessage(0)
      RETURN -3
   ENDIF
   
   cShema :=Alltrim(Control->Mishema)
   nData := SR_AddConnection(CONNECT_MYSQL,"
MYSQL=127.0.0.1;UID=Miusuario;PWD=MiPassword;DTB=" +cShema)
   cData:=cShema  
   DBCLOSEAREA("
Control")
   
   SR_EndConnection(nMain)
   IF nData < 0
      SR_END()
      MsgAlert("
02- No se puede establecer la conexión con "+cShema,"Verifique!")
      PostQuitMessage(0)
      RETURN -4
   ENDIF
   
   SR_SetActiveConnection(nData)  
   Open_Tabla("
Parametros")
   cTitulo:="
ServerSQL " + _VERSION + " trabajando para " + Params->MiEmpresa
   cNomemp:=ALLTRIM(Params->Nombre)
   DBCLOSEAREA("
Params")
   SR_EndConnection(nData)
   nData:= 0
   SR_END()
   
   DEFINE ICON  oAppIcon RESOURCE "
AppIcon"
   DEFINE ICON oIcon  FILE "
..\fwh1204\icons\fivewin.ICO"
   DEFINE ICON oIcon1 FILE "
..\fwh1204\icons\folder.ico"
     
   DEFINE FONT oFntBar  NAME "
Tahoma" SIZE 0,-11  
   
   DEFINE WINDOW oWnd TITLE "
ServerSQL" ICON  oAppIcon

   SET MESSAGE OF oWnd TO "
© 2009-2013"+cNInc 2007 COLOR CLR_BLACK,nColor5
   
   oWnd:oMsgBar:KeybOn()
   oWnd:oMsgBar:DateOn()

   
   DEFINE TIMER oTimer OF oWnd INTERVAL 60000 ACTION CHECA_EVENTOS()
   ACTIVATE TIMER oTimer
   cHora:=time()

   oWnd:oMsgBar:Refresh()
   oWnd:cTitle(cTitulo)
   
   ACTIVATE WINDOW oWnd  ;
     ON INIT (oTray := TTrayIcon():New( oWnd, oIcon, "
ServerPyME...",;
             { || (oWnd:Show(), oWnd:Maximize(), oWnd:SetFocus()) },;
             { | nRow, nCol | MenuTray( nRow, nCol, @oTray, @oWnd ) } ), CHECA_EVENTOS() ) ;
     VALID VALIDA_SALIDA() ;         
     ON RIGHT CLICK oTray:SetIcon( oIcon1, "
Another" ) ;
     ON RESIZE SHOWRESIZETYPE( nSizeType )
   IF ! EMPTY(oTray)
      oTray:End()
      oTray:=NIL
   ENDIF     
   PostQuitMessage(0)
   __QUIT()
RETURN (NIL)

* --------------------------------------------------------------------------*
FUNCTION VALIDA_SALIDA()
* --------------------------------------------------------------------------*
LOCAL RET:=.F.
IF lEventoActivo = .T.
   lFinalizaAplicacion:= .T.
   RET:=.F.
ELSE
   IF ! EMPTY(oTimer)
      oTimer:END()
      oTimer:=NIL
   ENDIF
   IF ! EMPTY(oTray)
      oTray:End()
      oTray:=NIL
   ENDIF
   lFinalizaAplicacion:= .T.  
   RET:=.T.
ENDIF
RETURN RET

* --------------------------------------------------------------------------*
FUNCTION CHECA_EVENTOS()
* --------------------------------------------------------------------------*
oWnd:setmsg("
inicio a las " + cHora + " timer a las " + time())
MSGINFO("
inicio a las " + cHora + " timer a las " + time())
IF lEventoActivo = .T.
   RETURN
ENDIF

lEventoActivo:=.T.

IF nData <= 0
   nMain := SR_AddConnection(CONNECT_MYSQL,"
MYSQL=127.0.0.1;UID=Miusuario;PWD=MiPassword;DTB=miDB")
   nData := SR_AddConnection(CONNECT_MYSQL,"
MYSQL=127.0.0.1;UID=Miusuario;PWD=MiPassword;DTB=" +cShema   )
ENDIF


SR_SetActiveConnection(nData)  

oDprg:=Open_Tabla("
Programa")

cFiltro:="
A.`PR_FRECUENCIA` = 'D' "
SELECT(oDprg)
SR_SetFilter(cFiltro)
(oDprg)->(DBGOTOP())
DO WHILE PR_FRECUENCIA = 'D'
   nHora := VAL(SUBSTR(TIME(),1,2))      
   IF (oDprg)->PR_ULTFECHA < DATE()
      IF (oDprg)->PR_HORAINICIO = nHora
         MSGINFO("
Voy a Ejecutar la funcion" + (oDprg)->PR_FUNCTION)
         (oDprg)->(RLOCK())
         REPLACE (oDprg)->PR_ULTFECHA WITH  DATE()
         (oDprg)->(DBUNLOCK())
      ENDIF
   ENDIF
   (oDprg)->(DBSKIP())
ENDDO
Close_Tabla("
Programa",oDprg)
SR_EndConnection(nMain)
SR_EndConnection(nData)
SR_END()
nData:= 0
lEventoActivo:=.F.
IF lFinalizaAplicacion = .T.
   IF ! EMPTY(oTimer)
      oTimer:END()
      oTimer:=NIL
   ENDIF
   IF ! EMPTY(oTray)
      oTray:End()
      oTray:=NIL
   ENDIF
   oWnd:END()
ENDIF
RETURN

* --------------------------------------------------------------------------*
FUNCTION PR_ErrorMessage( e )
* --------------------------------------------------------------------------*
         
    local cErrorLog:=MSGErrorDialog( e )
     
      cErrorLog += CRLF + _VER_POS + CRLF + "
Ocurrio el " + DTOC(DATE()) + " a las " + TIME() + CRLF   
      IF SR_GetRddName() = "
SQLRDD"
         if ! EMPTY(SR_LastSQLError(  ))
            cErrorLog += CRLF + SR_LastSQLError(  ) + CRLF
         endif
      ENDIF
return cErrorLog


FUNCTION Open_Tabla(cDbf)
LOCAL cAlias:=New_Alias(cDbf)
USE ("
MITABLA")  ALIAS (cAlias) SHARED NEW VIA "SQLRDD"
IF NETERR()
   RET:=.F.
ENDIF
RETURN (cAlias)

STAT FUNC New_Alias(cDbfName)
static n := 0
RETURN cDbfName + StrZero( IIF(++n > 998, 0, n), 3 )


FUNCTION Close_Tabla(_A)
IF SELECT(_A) > 0
   SELECT(_A)
   (_A)->(DBCLOSEAREA())
ENDIF
RETURN .T.
RETURN (NIL)


FUNCTION DB_CONNECTION(_SHEMA)
LOCAL nCon:=0
DEFAULT _SHEMA:="
premiumpyme"

nCon:=SR_AddConnection(CONNECT_MYSQL,"
MYSQL=127.0.0.1;UID=Miusuario;PWD=MiPassword;DTB=" + _SHEMA)

RETURN nCon

FUNCTION MenuTray( nRow, nCol, oTray, oWnd )

   local oMenu

   MENU oMenu POPUP
      MENUITEM "
Show" ACTION (oWnd:Show(), oWnd:Maximize(), oWnd:SetFocus())
      MENUITEM "
Hide" ACTION oWnd:Hide()
      SEPARATOR
      MENUITEM "
Cerrar ServerPyME" ACTION  (lFinalizaAplicacion:= .T., oWnd:END())
   ENDMENU

   ACTIVATE POPUP oMenu AT nRow, nCol OF oTray:oWnd

return NIL



STATIC FUNCTION SHOWRESIZETYPE( nSizeType )

    STATIC lInit := .T.
    DO CASE
        CASE nSizeType = SIZE_INIT
            //? "
SIZE_INIT"
            lInit = .F.
        CASE nSizeType = SIZE_RESTORED .AND. !lInit
            //? "
SIZE_RESTORED"
            oWnd:Show()
            oWnd:Maximize()
            oWnd:SetFocus()
        CASE nSizeType = SIZE_MINIMIZED
            //? "
SIZE_MINIMIZED"
            oWnd:Hide()
        CASE nSizeType = SIZE_MAXIMIZED
       
    ENDCASE

    RETURN NIL
   
regards, saludos

Antonio Linares
www.fivetechsoft.com
Enrrique Vertiz
Posts: 560
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru
Been thanked: 3 times
Contact:

Re: como usar SQLRDD y no morir en el intento

Post by Enrrique Vertiz »

Gustavo, buenas tardes

Por favor puedes comentarnos a que te refieres con que tu aplicacion es WEB ??, Web hecha con FWH ??, gracias
Enrrique Vertiz Pitta
Lima-Peru
xHb 1.23.1026X, Fwh 25.01, BCC74, MySQL 8.0.X, SQLLIB 1.9m
User avatar
Sistem
Posts: 226
Joined: Sun May 13, 2012 7:52 am

Re: como usar SQLRDD y no morir en el intento

Post by Sistem »

devtuxtla

una cuestión
en el ejemplo abajo, que es lo correcto?

Code: Select all | Expand


  Ator->(DbGoTop())
  TRY
  SR_BeginTransaction()
  Do While !Ator->(Eof())
      Ator->(BloqReg())
       Ator->Ato_Ator := Iif(Start= .f., "N", "S")
     Ator->(DbSkip())
  Enddo
  SR_CommitTransaction()
  SR_EndTransaction()
  CATCH oERR
  SR_RollBackTransaction()
  MSGINFO("Erro não foi possivel salvar as informações na tabela.","Error")
  END TRY
 

or

Code: Select all | Expand


  Ator->(DbGoTop())
  Do While !Ator->(Eof())
      TRY
      SR_BeginTransaction()
       Ator->(BloqReg())
       Ator->Ato_Ator := Iif(Start= .f., "N", "S")
      SR_CommitTransaction()
      SR_EndTransaction()
      CATCH oERR
      SR_RollBackTransaction()
      MSGINFO("Erro não foi possivel salvar as informações na tabela.","Error")
      END TRY
      Ator->(DbSkip())
  Enddo
 

or
?

¡gracias
FWH2008 | xHarbour | BCC74 | SQLRDD
User avatar
thefull
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona
Contact:

Re: como usar SQLRDD y no morir en el intento

Post by thefull »

Muchas gracias!
Pero para mi es imprescindible el uso de Harbour 3.2.
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
devtuxtla
Posts: 392
Joined: Tue Jul 29, 2008 1:55 pm

Re: como usar SQLRDD y no morir en el intento

Post by devtuxtla »

Hola System

La prima opcion para mi es correcta, ya que la proteccion de la transaccion, puede proteger todo proceso.

En lo personal, Hago una a proteccion para cada registro, solo cuando, los registros generan dependencia hacia un proceso para otro usuario.

Te recomiendo que pruebes ambas opciones y verifiques el performance.

Saludos
Visite Chiapas, el paraiso de México.
devtuxtla
Posts: 392
Joined: Tue Jul 29, 2008 1:55 pm

Re: como usar SQLRDD y no morir en el intento

Post by devtuxtla »

Hola The full.

Sigue siendo una lastima que Patrick Mask NO tenga una version de SQLRDD para Harbour.

Saludos
Visite Chiapas, el paraiso de México.
devtuxtla
Posts: 392
Joined: Tue Jul 29, 2008 1:55 pm

Re: como usar SQLRDD y no morir en el intento

Post by devtuxtla »

Hola enrique.

Te estoy preparando unas graficas para expresar como opera la aplicacion en WEB.

En un rato las pongo en el foro.

Saludos
Visite Chiapas, el paraiso de México.
Enrrique Vertiz
Posts: 560
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru
Been thanked: 3 times
Contact:

Re: como usar SQLRDD y no morir en el intento

Post by Enrrique Vertiz »

Gustavo, gracias !!!
Enrrique Vertiz Pitta
Lima-Peru
xHb 1.23.1026X, Fwh 25.01, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Post Reply