Clipper On Line • Ver Tópico - Harbour (ou xHarbour) BASICO com MYSQL

Harbour (ou xHarbour) BASICO com MYSQL

Discussão sobre SQL

Moderador: Moderadores

 

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 22 Mai 2015 00:38

Só comentário: página com muitos fontes fica lenta pra editar.

Continuando...
Usei um truque básico numa parte do fonte, e mexi um pouco com as cores.

SET COLOR TO W/N,W/GR+,,,G+/N
...
@ 12,46 GET westado
@ 16,36 GET wdt_entrada
@ 16,52 GET wdias        pict "9999"
@ 16,60 GET wdt_saida
@ 20,36 GET wqtde        pict "9,999.999"
@ 20,48 GET wvlr_unit    pict "9,999.999"
@ 20,60 GET wvlr_total   pict "9,999,999.99"
CLEAR GETS


GET sem GET.
Pra que serve?
Como defini cor diferente pra GET fora de foco, o resultado é isso em cores diferentes.

Vantagem: pra mudar todas as cores, só precisa mudar a primeira linha e nada mais.
GET em foco de uma cor, GET fora de foco de outra cor, e tela de outra.
Com um único SET COLOR, já temos cores diferentes, sem precisar indicar cor no fonte.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 22 Mai 2015 00:43

Na consulta alterei pouco:

   LOCAL nSelect := Select()
   LOCAL cOrdSetFocus
   SELECT LOTES
   cOrdSetFocus := OrdSetFocus()
...
   OrdSetFocus( cOrdSetFocus )
   SELECT ( nSelect )


- guarda em que ALIAS estava posicionado quando chegou nele
- guarda a ordem usada em LOTES quando chegou nele
Depois de fazer o que precisa
- volta LOTES pra ordem que estava
- volta ao ALIAS que estava

Como se nada tivesse acontecido.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 22 Mai 2015 00:55

Vou parar as mudanças por aqui.
A próxima etapa vai ser alterar pra MySQL.
Como uso ADO, vai ser com ele.
O fonte pra DBF terminou assim.
#include "inkey.ch"

PROCEDURE Main
   SET CENTURY ON
   SET DATE BRITISH
   SET EPOCH TO 2001
   SET DELETE ON
   SET MESSAGE TO 24 CENTER
   SetMode( 25, 80 )
   SET COLOR TO W/N,W/GR+,,,G+/N
   CLS
   TelaInicial()
   AbreArquivos()
   @ 02,01 TO 02,80
   @ 23,01 TO 23,80
   @ 01,01 SAY space(80) COLOR "W/B"
   @ 01,01 SAY "LOTES - Aprendizado Harbour e xHarbour" COLOR "W/B"
   @ 01,70 SAY date() COLOR "W/B"
   memoria = memory()
   @ 03,54 SAY memory() pict "9,999,999,999"
   @ 03,68 SAY "Kb Mem¢ria"
   dc = " "
   // OPERACAO

   do while .t.

      wlote       = space(07)
      westado     = space(02)
      wdt_entrada = datavol4(space(08))
      wdias       = 0
      wdt_saida   = datavol4(space(08))
      wqtde       = 0
      wvlr_unit   = 0
      wvlr_total  = 0
      Msg(  "Informe o LOTE                              [branco] finaliza" )
      @ 09,34 SAY "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
      @ 10,34 SAY "³ Lote....: °°°°°°          ? Pesquisa ³"
      @ 11,34 SAY "³                                      ³"
      @ 12,34 SAY "³ Estado..: °° °°°°°°°°°°°°°°°°°°°     ³"
      @ 13,34 SAY "³                                      ³"
      @ 14,34 SAY "³   Entrada       Dias     Devolu‡„o   ³"
      @ 15,34 SAY "³ ÄÄÄÄÄÄÄÄÄÄ      ÄÄÄÄ    ÄÄÄÄÄÄÄÄÄÄ   ³"
      @ 16,34 SAY "³ °°/°°/°°°°   +  °°°°  = °°/°°/°°°°   ³"
      @ 17,34 SAY "³                                      ³"
      @ 18,34 SAY "³    Qtde      Unit rio    Valor Total ³"
      @ 19,34 SAY "³ ÄÄÄÄÄÄÄÄÄ   ÄÄÄÄÄÄÄÄÄ   ÄÄÄÄÄÄÄÄÄÄÄÄ ³"
      @ 20,34 SAY "³ °°°°°°°°° x °°°°°.°°° = °°°°°°°°°.°° ³"
      @ 21,34 SAY "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
      @ 22,34 SAY "                                        "

      @ 10,46 get wlote pict "@!"
      read
      if Empty( wlote ) .OR. LastKey() == K_ESC
         clear
         EXIT
      endif
      if wlote = "?"
         consulta()
         loop
      endif

      // consulta
      sele lotes
      seek wlote
      if .not. eof()
         westado     = estado
         wdt_entrada = datavol4(dt_entrada)
         wdias       = dias
         wdt_saida   = datavol4(dt_saida)
         wqtde       = qtde
         wvlr_unit   = vlr_unit
         wvlr_total  = vlr_total
         @ 12,46 GET westado
         @ 16,36 GET wdt_entrada
         @ 16,52 GET wdias        pict "9999"
         @ 16,60 GET wdt_saida
         @ 20,36 GET wqtde        pict "9,999.999"
         @ 20,48 GET wvlr_unit    pict "9,999.999"
         @ 20,60 GET wvlr_total   pict "9,999,999.99"
         CLEAR GETS
         EstadoOk( wEstado ) // mesma da validação
         Msg( "Registro existente. Deseja Alterar, Excluir ou Voltar ? ... A/E/V ..." )
         @ 24,73 get dc pict "!" valid dc $ "AEV"
         read
         if upper(dc) = "V" .OR. LastKey() == K_ESC
            loop
         elseif upper(dc) = "A"
            woquefazer = "ALT"
         elseif upper(dc) = "E"
            woquefazer = "EXC"
         endif
      else
         woquefazer = "INC"
      endif

      // exclusao
      if woquefazer = "EXC"
         IF MsgSimNao( "Confirma a exclus„o do Lote " + rtrim(wlote) + " ? ... S/N ..." )
            sele lotes
            seek wlote
            if eof()
               alert ( "Erro - chamar CPD - registro n„o existe mais" )
            else
               delete
            endif
         endif
         loop
      endif

      // inclusao e alteracao
      if woquefazer = "INC"
         @ 22,35 SAY "Registro Novo" COLOR "GR+/N"
      elseif woquefazer = "ALT"
         @ 22,35 SAY "Edição de Registro" COLOR "GR+/N"
      endif

      @ 12, 46 GET wEstado PICTURE "@!" VALID EstadoOk( wEstado ) MESSAGE "Informe o ESTADO, ESC abandona"
      @ 16, 36 GET wDt_Entrada          VALID Dtos( wDt_Entrada ) >= "20150101" .AND. wDt_Entrada <= Date() MESSAGE "Informe a Data de Entrada, ESC abandona"
      @ 16, 52 GET wDias PICTURE "9999" VALID wDias > 0 MESSAGE "Informe a qtde. de dias, ESC abandona"
      @ 16, 60 GET wDt_Saida WHEN ( wDt_Saida := wDt_Entrada + wDias, .F. )
      @ 20, 36 get wqtde                PICTURE "9,999.999" valid wqtde >= 0 MESSAGE "Informe a Quantidade, ESC abandona"
      @ 20, 48 get wvlr_unit            PICTURE "9,999.999" valid wvlr_unit >= 0 MESSAGE "Informe o valor unitário, ESC abandona"
      @ 20, 60 GET wVlr_Total PICTURE "9,999,999.99" WHEN ( wVlr_Total := wQtde * wVlr_Unit, .F. )
      READ
      Inkey(3)

      if LastKey() != K_ESC
         if woquefazer = "INC"
            sele lotes
            append blank
         elseif woquefazer = "ALT"
            sele lotes
            seek (wlote)
            if eof()
               alert ( "Erro - chamar CPD - registro n„o existe mais" )
               loop
            endif
         endif
         rlock()
         replace lote         with wlote
         replace estado       with westado
         replace dt_entrada   with dtos(wdt_entrada)
         replace dias         with wdias
         replace dt_saida     with dtos(wdt_saida)
         replace qtde         with wqtde
         replace vlr_unit     with wvlr_unit
         replace vlr_total    with wvlr_total
         unlock
      endif
   enddo
   CLOSE DATABASES
   RETURN

FUNCTION Msg( cTexto )
   @ 24,01 SAY space(80)
   IF cTexto != NIL
      @ 24,03 SAY cTexto COLOR "GR+/N"
   ENDIF
   RETURN NIL

FUNCTION MsgPausa( cTexto )
   Msg( cTexto )
   inkey(0)
   Msg()
   RETURN NIL

FUNCTION MsgSimNao( cTexto )
   Msg( cTexto )
   @ Row(), Col() + 2 GET cResposta PICTURE "!" VALID cResposta $ "SN"
   READ
   Msg()
   RETURN cResposta

FUNCTION datavol4( wdv_Data )
   //set century on
   w_data_dv = ctod(subst(wdv_data,7,2)+"/"+subst(wdv_data,5,2)+"/"+subst(wdv_data,1,4))
   return w_data_dv

STATIC FUNCTION TelaInicial()
   @ 07,59 SAY "CLIPPER BASICO"
   @ 03,01 SAY "PROC01 Clipper               ³"
   @ 04,01 SAY "                             ³"
   @ 05,01 SAY "PROC11 Harbour Local  DBF    ³"
   @ 06,01 SAY "PROC12 Harbour Remoto DBF    ³"
   @ 07,01 SAY "PROC13 Harbour Remoto MYSQL  ³"
   @ 08,01 SAY "                             ³"
   @ 09,01 SAY "PROC21 xHarbour Local  DBF   ³"
   @ 10,01 SAY "PROC22 xHarbour Remoto DBF   ³"
   @ 11,01 SAY "PROC23 xHarbour Remoto MYSQL ³"
   @ 12,01 SAY "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
   @ 16,01 SAY "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
   @ 17,01 SAY "- Testando os campos b sicos ³"
   @ 18,01 SAY "- C lculo de Data + Dias     ³"
   @ 19,01 SAY "- Inclus„o/Altera‡„o/Exclus„o³"
   @ 20,01 SAY "- Uso DbEdit para Consulta   ³"
   @ 21,01 SAY "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
   RETURN NIL

STATIC FUNCTION AbreArquivos()
   SELECT 0
   USE LOTES
   INDEX ON lote                                TO ilote1
   INDEX ON estado+lote+dt_entrada              TO ilote2
   INDEX ON dt_entrada+lote                     TO ilote3
   INDEX ON dt_saida+lote                       TO ilote4
   SET INDEX TO ilote1, ilote2, ilote3, ilote4
   SELECT 0
   USE estado
   INDEX ON sigla_uf                            TO iuf1
   SET INDEX TO iuf1
   RETURN NIL

STATIC FUNCTION EstadoOk( cEstado )
   LOCAL nSelect := Select(), lOk := .T.
   SELECT estado
   SEEK cEstado
   IF Eof()
      Alert ( "Estado não encontrado" )
      lOK := .F.
   ELSE
      @ 12,49 SAY estado COLOR "G+/N"
   ENDIF
   RETURN lOk
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 22 Mai 2015 01:55

Não testei.
Chamei o recordset de oTemporario, assim acho que fica mais claro que seria algo similar a um arquivo temporário.

#include "inkey.ch"

STATIC oConexao

PROCEDURE Main
   ConfiguraConexao()
   oConexao:Open()
   SET CENTURY ON
   SET DATE BRITISH
   SET EPOCH TO 2001
   SET DELETE ON
   SET MESSAGE TO 24 CENTER
   SetMode( 25, 80 )
   SET COLOR TO W/N,W/GR+,,,G+/N
   CLS
   TelaInicial()
   @ 02,01 TO 02,80
   @ 23,01 TO 23,80
   @ 01,01 SAY space(80) COLOR "W/B"
   @ 01,01 SAY "LOTES - Aprendizado Harbour e xHarbour" COLOR "W/B"
   @ 01,70 SAY date() COLOR "W/B"
   memoria = memory()
   @ 03,54 SAY memory() pict "9,999,999,999"
   @ 03,68 SAY "Kb Mem¢ria"
   dc = " "
   // OPERACAO

   do while .t.

      wlote       = space(07)
      westado     = space(02)
      wdt_entrada = datavol4(space(08))
      wdias       = 0
      wdt_saida   = datavol4(space(08))
      wqtde       = 0
      wvlr_unit   = 0
      wvlr_total  = 0
      Msg(  "Informe o LOTE                              [branco] finaliza" )
      @ 09,34 SAY "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
      @ 10,34 SAY "³ Lote....: °°°°°°          ? Pesquisa ³"
      @ 11,34 SAY "³                                      ³"
      @ 12,34 SAY "³ Estado..: °° °°°°°°°°°°°°°°°°°°°     ³"
      @ 13,34 SAY "³                                      ³"
      @ 14,34 SAY "³   Entrada       Dias     Devolu‡„o   ³"
      @ 15,34 SAY "³ ÄÄÄÄÄÄÄÄÄÄ      ÄÄÄÄ    ÄÄÄÄÄÄÄÄÄÄ   ³"
      @ 16,34 SAY "³ °°/°°/°°°°   +  °°°°  = °°/°°/°°°°   ³"
      @ 17,34 SAY "³                                      ³"
      @ 18,34 SAY "³    Qtde      Unit rio    Valor Total ³"
      @ 19,34 SAY "³ ÄÄÄÄÄÄÄÄÄ   ÄÄÄÄÄÄÄÄÄ   ÄÄÄÄÄÄÄÄÄÄÄÄ ³"
      @ 20,34 SAY "³ °°°°°°°°° x °°°°°.°°° = °°°°°°°°°.°° ³"
      @ 21,34 SAY "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
      @ 22,34 SAY "                                        "

      @ 10,46 get wlote pict "@!"
      read
      if Empty( wlote ) .OR. LastKey() == K_ESC
         clear
         EXIT
      endif
      if wlote = "?"
         consulta()
         loop
      endif

      // consulta
      oTemporario := oConexao:Execute( "SELECT * FROM LOTES WHERE LOTE=" + Ltrim( Str( wLote ) ) )
      IF oTemporario:RecordCount() != 0
         westado     = oTemporario:Fields( "ESTADO" ):Value
         wdt_entrada = datavol4( oTemporario:Fields( "DT_ENTRADA" ):Value )
         wdias       = oTemporario:Fields( "DIAS" ):Value
         wdt_saida   = datavol4( oTemporario:Fields( "DT_SAIDA" ):Value )
         wqtde       = oTemporario:Fields( "QTDE" ):Value
         wvlr_unit   = oTemporario:Fields( "VLR_UNIT" ):Value
         wvlr_total  = oTemporario:Fields( "VLR_TOTAL" ):Value
         @ 12,46 GET westado
         @ 16,36 GET wdt_entrada
         @ 16,52 GET wdias        pict "9999"
         @ 16,60 GET wdt_saida
         @ 20,36 GET wqtde        pict "9,999.999"
         @ 20,48 GET wvlr_unit    pict "9,999.999"
         @ 20,60 GET wvlr_total   pict "9,999,999.99"
         CLEAR GETS
         EstadoOk( wEstado ) // mesma da validação
         Msg( "Registro existente. Deseja Alterar, Excluir ou Voltar ? ... A/E/V ..." )
         @ 24,73 get dc pict "!" valid dc $ "AEV"
         read
         if upper(dc) = "V" .OR. LastKey() == K_ESC
            loop
         elseif upper(dc) = "A"
            woquefazer = "ALT"
         elseif upper(dc) = "E"
            woquefazer = "EXC"
         endif
      else
         woquefazer = "INC"
      endif
      oTemporario:Close()
      // exclusao
      if woquefazer = "EXC"
         IF MsgSimNao( "Confirma a exclus„o do Lote " + rtrim(wlote) + " ? ... S/N ..." )
            oTemporario := oConexao:Execute( "SELECT COUNT(*) AS QTD FROM LOTES WHERE LOTE=" + Ltrim( Str( wLote ) ) )
            IF oTemporario:Fields( "QTD" ):Value == 0
               alert ( "Erro - chamar CPD - registro n„o existe mais" )
            else
               oConexao:Execute( "DELETE FROM LOTES WHERE LOTE=" + Ltrim( Str( wLote ) ) )
            endif
            oTemporario:Close()
         endif
         loop
      endif

      // inclusao e alteracao
      if woquefazer = "INC"
         @ 22,35 SAY "Registro Novo" COLOR "GR+/N"
      elseif woquefazer = "ALT"
         @ 22,35 SAY "Edição de Registro" COLOR "GR+/N"
      endif

      @ 12, 46 GET wEstado PICTURE "@!" VALID EstadoOk( wEstado ) MESSAGE "Informe o ESTADO, ESC abandona"
      @ 16, 36 GET wDt_Entrada          VALID Dtos( wDt_Entrada ) >= "20150101" .AND. wDt_Entrada <= Date() MESSAGE "Informe a Data de Entrada, ESC abandona"
      @ 16, 52 GET wDias PICTURE "9999" VALID wDias > 0 MESSAGE "Informe a qtde. de dias, ESC abandona"
      @ 16, 60 GET wDt_Saida WHEN ( wDt_Saida := wDt_Entrada + wDias, .F. )
      @ 20, 36 get wqtde                PICTURE "9,999.999" valid wqtde >= 0 MESSAGE "Informe a Quantidade, ESC abandona"
      @ 20, 48 get wvlr_unit            PICTURE "9,999.999" valid wvlr_unit >= 0 MESSAGE "Informe o valor unitário, ESC abandona"
      @ 20, 60 GET wVlr_Total PICTURE "9,999,999.99" WHEN ( wVlr_Total := wQtde * wVlr_Unit, .F. )
      READ
      Inkey(3)

      if LastKey() != K_ESC
         if woquefazer = "INC"
            oConexao:Execute( "INSERT INTO LOTES ( LOTE ) VALUES ( " + Ltrim( Str( wLote ) ) )
         endif
         oConexao:Execute( [UPDATE LOTES SET ] + ;
            [ESTADO='] + wEstado + [', ] + ;
            [DT_ENTRADA='] + Dtos( wDt_Entrada ) + [', ] + ;
            [DIAS=] + Ltrim( Str( wDias ) ) + [, ] + ;
            [DT_SAIDA="] + Dtos( wDt_Saida ) + [", ] + ;
            [QTDE=] + Ltrim( Str( wQtde ) ) + [, ] + ;
            [VLR_UNIT=] + Ltrim( Str( wVlr_Unit ) ) + [, ] + ;
            [VLR_TOTAL=] + Ltrim( Str( wVlr_Total ) ) + [ ) ] + ;
            [WHERE LOTE=] + Ltrim( Str( wLote ) ) )
      endif
   enddo
   oConexao:Close()
   RETURN

FUNCTION Msg( cTexto )
   @ 24,01 SAY space(80)
   IF cTexto != NIL
      @ 24,03 SAY cTexto COLOR "GR+/N"
   ENDIF
   RETURN NIL

FUNCTION MsgPausa( cTexto )
   Msg( cTexto )
   inkey(0)
   Msg()
   RETURN NIL

FUNCTION MsgSimNao( cTexto )
   Msg( cTexto )
   @ Row(), Col() + 2 GET cResposta PICTURE "!" VALID cResposta $ "SN"
   READ
   Msg()
   RETURN cResposta

FUNCTION datavol4( wdv_Data )
   //set century on
   w_data_dv = ctod(subst(wdv_data,7,2)+"/"+subst(wdv_data,5,2)+"/"+subst(wdv_data,1,4))
   return w_data_dv

STATIC FUNCTION TelaInicial()
   @ 07,59 SAY "CLIPPER BASICO"
   @ 03,01 SAY "PROC01 Clipper               ³"
   @ 04,01 SAY "                             ³"
   @ 05,01 SAY "PROC11 Harbour Local  DBF    ³"
   @ 06,01 SAY "PROC12 Harbour Remoto DBF    ³"
   @ 07,01 SAY "PROC13 Harbour Remoto MYSQL  ³"
   @ 08,01 SAY "                             ³"
   @ 09,01 SAY "PROC21 xHarbour Local  DBF   ³"
   @ 10,01 SAY "PROC22 xHarbour Remoto DBF   ³"
   @ 11,01 SAY "PROC23 xHarbour Remoto MYSQL ³"
   @ 12,01 SAY "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
   @ 16,01 SAY "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
   @ 17,01 SAY "- Testando os campos b sicos ³"
   @ 18,01 SAY "- C lculo de Data + Dias     ³"
   @ 19,01 SAY "- Inclus„o/Altera‡„o/Exclus„o³"
   @ 20,01 SAY "- Uso DbEdit para Consulta   ³"
   @ 21,01 SAY "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
   RETURN NIL

STATIC FUNCTION EstadoOk( cEstado )
   LOCAL oTemporario, lOk := .T.
   oTemporario := oConexao:Execute( [SELECT * FROM ESTADO WHERE ESTADO='] + cEstado + ['] )
   IF oTemporario:RecordCount() == 0
      Alert ( "Estado não encontrado" )
      lOK := .F.
   ELSE
      @ 12,49 SAY oTemporario:Fields( "ESTADO" ):Value COLOR "G+/N"
   ENDIF
   oTemporario:Close()
   RETURN lOk

STATIC FUNCTION ConfiguraConexao()
   oConexao := win_OleCreateObject( "ADODB.Connection" )
   oConexao:ConnectionString := "Driver={MySQL ODBC 3.51 Driver};Server=NomeServidor;" + ;
      "Option=131072;Stmt=;Database=NomeBanco;User ID=NomeUsuario;Password=Senha;Collation=latin1;"
   oConexao:CursorLocation    := 3   // local recordset
   oConexao:CommandTimeOut    := 120 // seconds
   oConexao:ConnectionTimeOut := 120 // seconds
   RETURN NIL


Considerações:

oTemporario:Fields( "NOME" ):Value
Isso equivale a pegar o conteúdo do campo chamado NOME

oTemporario:RecordCount()
O próprio nome já diz. Contador de registros. Quantos registros foram retornados.
Uma diferença no ADO é que não se pode testar EOF em arquivo vazio., dá erro. A saída é usar o RecordCount()

oTemporario:Close()
Seria o equivalente a apagar o temporário. Na prática não existe nada em disco.

oTemporario := oConexao:Execute( ... )
Vai executar o comando na conexão. O retorno vai ser o equivalente a um arquivo temporário contendo registros ou não.

oConexao:Open()
Abre a conexão, é por essa conexão que o terminal conversa com o servidor, e vice-versa.

oConexao:Close()
Encerra a conexão.

INSERT INTO LOTES ( CAMPO ) VALUES ( VALOR )
Inclui um registro na tabela LOTES, gravando no CAMPO o VALOR.

UPDATE LOTES SET CAMPO=VALOR WHERE LOTE=x
Atualiza no arquivo LOTES, aonde o LOTE for número x, alterando o CAMPO para VALOR

DELETE FROM LOTES WHERE LOTE=x
Apaga do arquivo LOTES, aonde o LOTE for número x

De resto, no SQL string é entre aspas simples, e número é direto o número.
Por isso no comando SQL tem que acrescentar aspas, ou transformar o número em string pra ter a linha de comando.

No meu caso, preferi usar funções pra esse tipo de coisa.
Exemplo: StringSql( campo )

FUNCTION StringSql( cCampo )
   RETURN ['] + cCampo + [']


Além de evitar erro nos abrir/fechar aspas, já coloco tratamento de alguns caracteres especiais.

No browse, teria que fazer uma conversão total de oTemporario pra DBF.

dbCreate( "TEMP", ...estrutura )
USE TEMP
oTemporario := oConexao:Execute( "SELECT * FROM LOTES" )
IF oTemporario:RecordCount() > 0
   DO WHILE .NOT. oTemporario:Eof()
      APPEND BLANK
      REPLACE temp->Lote WITH oTemporario:Fields( "LOTE" ):Value, ;
         temp->Dt_Entrada WITH oTemporario:Fields( "DT_ENTRADA" ):Value, ;
         ...
      oTemporario:MoveNext()
   ENDDO
ENDIF
oTemporario:Close()


oTemporario:MoveNext() é o equivalente de SKIP.

No momento com ADO estou usando esse esquema, estilo arquivo temporário, e convertendo se necessário.

Ah sim... a compilação do fonte final em Harbour:

hbmk2 lote01 c_lote hbwin.hbc

O outro fonte c_Lote:
Teria que ter a rotina acima, e o restante fica igual, mas tendo que criar os índices também como temporários.
A diferença é não ter que salvar/retornar área em uso, porque não existe.

Pra arquivos gigantes, o ideal seria primeiro pedir algum tipo de filtro, para só depois mostrar para o usuário.
O que mudaria pro temporário, seria sua criação mais rápida, com menos registros.

oTemporario := "SELECT * FROM LOTES WHERE DT_ENTRADA >= '20150101' AND DT_ENTRADA <= '20150131'"
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 22 Mai 2015 02:09

Apesar de já ter dito antes, talvez seja melhor escrever de novo:
Esse modo é sem usar nenhuma biblioteca do Harbour, não depende de nada adicional.
Por isso o browse precisa da conversão.

Se usar alguma biblioteca do Harbour, pode ser que facilite alguma coisa.
Quando testei RDDADO deu erro no browse, então preferi ir em frente sem depender de nada, só de mim mesmo.
Sobre bibliotecas do Harbour pra isso, aí vai de quem use pra poder passar informações.

Mas seria interessante pra todos, talvez até pra mim mesmo, que usuários de LIBs mostrassem esse último fonte em DBF (mais enxuto) convertido pra alguma LIB existente no Harbour.

Pelo jeito é uma boa hora pra divulgar, já que o interesse em MySQL está aumentando.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 22 Mai 2015 02:20

Último comentário:
No fonte inicial, haviam duas validações de estado, uma no SAY e outra no GET.
Enxugar o fonte antes, reduziu isso pra uma única função.
E na hora de transformar isso pra MySQL, foi só transformar num único lugar.

Ou seja, é como se eu já estivesse melhorando pro MySQL antes mesmo de mexer com ele.

E não tem como eu não repetir:
Melhorando os fontes, está melhorando pra qualquer coisa que fizer depois.
Se um único fonte já fez diferença, um aplicativo inteiro com muitos fontes vai fazer muito mais diferença.

Este foi o motivo de eu ter usado esse fonte como exemplo.
Acho que serviu bem pra demonstrar que nem sempre sair convertendo é uma melhor opção.
E o tempo de conversão depende muito de como está o fonte.

Tá desanimando pra converter porque tá difícil...
Tudo bem: vá melhorando o fonte, que já vai estar adiantando o serviço, e vai ficar animado.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 22 Mai 2015 09:23

Faltou fechar parênteses na no insert.

 oConexao:Execute( "INSERT INTO LOTES ( LOTE ) VALUES ( " + Ltrim( Str( wLote ) ) )


Isso vai gerar INSERT INTO LOTES ( LOTE ) VALUES ( 1

Faltou somar ")"

 oConexao:Execute( "INSERT INTO LOTES ( LOTE ) VALUES ( " + Ltrim( Str( wLote ) ) + ")" )


Sobre o horário, no painel de controle estava horário de Brasília, horário de verão desativado.
Ativei, depois mudei pra horário do Atlântico, depois voltei pra horário de Brasília..
Por último voltei ao que estava no início e ficou certo.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 23 Mai 2015 12:45

Mais um comentário, sobre as rotinas de mensagem:

FUNCTION Msg( cTexto ) 
    @ 24,01 SAY space(80)
    IF cTexto != NIL
       @ 24,03 SAY cTexto COLOR "GR+/N"
    ENDIF
    RETURN NIL
   
FUNCTION MsgPausa( cTexto )
    Msg( cTexto )
    inkey(0)
    Msg()
    RETURN NIL
   
FUNCTION MsgSimNao( cTexto )
    Msg( cTexto )
    @ Row(), Col() + 2 GET cResposta PICTURE "!" VALID cResposta $ "SN"
    READ
    Msg()
    RETURN cResposta


Ok, dá pra simplificar mais, mas mesmo assim o resultado é:

Msg() acabou sendo usada pra mostrar mensagem, e limpar mensagem. E é usada pelas outras.
MsgPausa() e MsgSimNao() nem sequer sabem aonde é que a mensagem aparece.
Se quiser mudar o aplicativo pra mostrar a mensagem em uma posição diferente, basta alterar Msg()

Se alterar pra modo gráfico, de repente poderia colocar as mensagens em uma barra de status, bastando alterar a função Msg()

A Sim/Não também poderia ser trocada para a equivalente do Windows, já em modo gráfico.

Que coisa legal. Estávamos preparando até pra ambiente gráfico, sem nem pensar nisso.

Ah... mas eu preciso muitos SimNão, e usar direto no IF não dá, e posso precisar do "S" ou "N" pra replace...
Ok. Se for usar a mesma rotina de Sim/Nao, poderia fazer assim.
lContribuinte  := MsgSimNao( "Contribuinte ICMS Sim ou Não" )
lConfirma := MsgSimNao( "Tem certeza" )
IF lConfirma
   REPLACE CLIENTE->Contribuinte WITH iif( lContribuinte, "S", "N" )
ENDIF


Como saber se estou simplificando ou complicando?
Imagine ensinar alguém a usar suas funções.
Se for complicado ensinar uma função simples, então talvez sua função esteja complicada.
Se pra voce mesmo usar, voce tiver que ficar olhando detalhes da função ou variáveis, talvez ela esteja complicada - a não ser que realmente seja uma função que faz trabalho complicado e por isso precisa muitos detalhes.

A antiga função pra Sim/Não não estava boa.
Porque?
Era um simples Sim ou Não, mesmo assim precisava olhar na função que precisava de uma variável chamada DC.
Se é uma mensagem de Sim ou Não, mais fácil ela retornar "S" ou "N", ou verdadeiro/falso, o que a torna auto-explicativa.

Se o que estiver fazendo, estiver facilitando seu serviço, é sinal de que você está no caminho certo.

Melhorar fonte é:
- melhorar pra Harbour, sem mexer com Harbour
- melhorar pra parte gráfica, sem mexer com parte gráfica
- Facilitar programar, que é facilitar nosso trabalho

Na correria esquecemos disso, porque isso não faz diferença para o cliente.
Mas faz pra nós.
Evoluir na programação não significa trocar editor de texto, ou linguagem de programação.
Significa cada vez ser mais fácil programar.

Isso não tem a ver com anos de prática, tem a ver com "por em prática".
Não espere que seja mais fácil programar, faça ser mais fácil.
(Isso me lembrou a cena do Matriz da luta de karatê... rs)

Fui muito repetitivo e filosófico no post, mas acho que foi pra uma boa causa.
Espero que ajude algum usuário do fórum.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor manuel1437 » 31 Mai 2015 23:43

Quintas e Amigos - Boa Noite

Quintas, MUITO OBRIGADO pela disposição em ensinar. Vou evoluir, com certeza.

1) Apanhei um pouco com a conexão com o Mysql ... Resolvi então limpar todo o programa e fazer um novo teste, que também não funcionou. Talvez algo esteja faltando em meu computador (XP), não sei. Utilizo uma outra ferramenta nesta maquina, chamada Scriptcase, que acessa a base MYSQL externa normalmente. Repeti exatamente o endereco da base MYSQL, o nome do Banco de Dados, o Usuario e a Senha de acesso. Nao coloquei aspas para identificar estas informacoes na String Conexao. Lá eu tinha que informar a Porta.

No site www.connectionstrings.com (muito bom, por sinal), vi como adicionar a porta 3306 na String de Conexão que você passou. E nada...

Error WINOLE/1007 [Microsoft][ODBC Driver Manager]
Nome da fonte de dados nao encontrado e nenhum driver padrao especificado (0x800004005): Microsoft OLE DB Provider for ODBC Drivers
(DOS Error -2147352567)

Até que descobri, rs... nao tinha o Driver ODBC instalado na minha maquina...
http://www.connectionstrings.com/mysql-
secao -download/ - instalei e resolveu meus problemas - ja enxergo via ADO o mysql remoto

Eu tinha gravado a tabela no MYSQL com o nome "cadastro" ... o programa ainda apresentava erros, ate perceber que no programa a instrucao SQL estava CADASTRO.
Coloquei em minuscula e ... resolveu ! CaseSensitive ... gravei os registros, alterei e exclui...

Outra coisa diferente do Clipper: o "alert" do erro estava aparecendo muito abaixo, criando uma barra de rolagem gigantesca na janela DOS.
Nao coloquei o SET MODE, mas estranhei este comportamento.
Uma duvida: no Clipper estavamos limitados a 25x80, agora eu posso fazer uma janela bem maior e usar @lin,col para aproveitar este espaco?

=============================================

Mas, pesquisando no Forum, tambem acabei encontrando por acaso uma discussao sadia entre ADO e SQLMIX (o Amigo Itamar pode ajudar com SQLMIX ?)

Vamos lá. Eis o programa anexo, que:
1) Abre Base
2) Gravacao
gravar 15 registros (coloquei um diferenciador no nome, Jose 1, Jose 2, Jose 3.... Jose 15), todos com idade 30
fiz no clipper um exemplo de inclusao com vetores. A ideia de usar os 3 vetores da Maria x é criar os 3 registros numa unica instrucao INSERT
3) Alteracao
alterar a idade o "Jose 11" para 50
4) Exclusao
excluir o "Jose 7"
5) Consulta e exibicao
listar todos os que tem idade 30 .. ou seja, 13 registros Jose ...
nao vira o Jose 11 pq tem 50 anos, e nao vira o "Jose 7", que foi excluido
e nao vira as Marias, que tem 25 anos...

ou seja, com isto a gente trabalha com as 4 operacoes indispensaveis la com o BD

Fiz o teste no ADO com INCLUSAO (so Jose), ALTERACAO e EXCLUSAO estao ok ... faltou a parte da consulta

Voce pode pegar o mesmo exemplo e escrever nele, no IF do ADO. Fiz um IF para separar o que existe para DBF e a instrucao equivalente no ADO e SQLMIX

Peco ao Itamar fazer o mesmo com o SQLMIX.

Estou usando o Harbour que baixei de http://sourceforge.net/projects/harbour ... p_redirect

Grande Abraco, agora eu aprendo, rs

Manuel

** Ao digitar este post, vi na Secao Harbour uma otima noticia, sob o titulo "PRG sendo executado na web como um PHP"
Anexos
APRENDE.ZIP
(2.27 KiB) Baixado 62 vezes
manuel1437
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 5
Data de registro: 20 Mai 2015 18:41
Cidade/Estado: Sao Paulo
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 01 Jun 2015 01:13

Com um modelo já pronto em DBF e ADO, acabou fazendo outro.... esquisito.
Acabou voltando a ter algo desnecessário: GOTO TOP antes do SEEK.
Fazer direto no post a consulta que falta:

wpesq = 30
if wbanco = "DBF"
   *************** CLIPPER ************************
   sele cadastro
       set order to 2
       go top
   seek (wpesq)
   lin = 1
   do while idade = wpesq .and. .not. eof()
      @ lin,01 say nome
      @ lin,25 say dtnasc
      @ lin,37 say idade     pict "99"                   
      lin = lin + 1
      skip
   enddo
elseif wbanco = "ADO"
   ****************** ADO / HARBOUR ***************
   wsql = "SELECT * FROM cadastro WHERE IDADE = " + NumericSql(wpesq) + " ORDER BY IDADE"
   oTemporario := oConexao:Execute( wsql )
   IF oTemporario:RecordCount() > 0
      nLin := 1
      DO WHILE .NOT. oTemporario:Eof()
         @ lin,01 say oTemporario:Fields( "NOME" ):Value
         @ lin,25 say oTemporario:Fields( "DTNASC" ):Value
         @ lin,37 say oTemporario:Fields( "IDADE" ):Value pict "99"                   
         lin = lin + 1
         oTemporario:MoveNext()
      enddo
   ENDIF
   oTemporario:Close()


Mais uma coisa: DATA
Pra evitar problemas com formato de data, melhor no SQL usar ano-mes-dia, e pra facilitar, uma função DateSql()
E em SQL não existe data em branco, então a saída é deixar vazio com NULL.
É óbvio que precisa algo parecido na leitura.

FUNCTION DateSql( dData )
   LOCAL cText
   IF Empty( dData )
      cText := "NULL"
   ELSE
      cText := ['] + Transform( Dtos( dData ), "@R 9999-99-99" ) + [']
   ENDIF
   RETURN cText


Sobre o nome em minúsculas: No Linux é obrigatório respeitar o "case". No Windows o default é minúsculas, mesmo que coloque em maiúsculas.
Sobre o SetMode(): Sim, no Harbour pode usar o que quiser, ao contrário do Clipper que fica limitado aos tamanhos padrão do DOS: 25x80, 28x80, 43x80, 50x80

Nota:
No ADO o programa conversa direto com a informação do banco de dados, então qualquer tipo diferente precisa tratar.
Apesar de não parecer, é como se você estivesse criando sua própria biblioteca ADO, começando por StringSql(), NumericSql() e DateSql().
Por um lado tem que criar essas funções, mas por outro lado nossa bilbioteca vai ser do nosso jeito.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 01 Jun 2015 05:54

Não sei se pode fazer diferença na escolha.
ASP, VB e VBScript e VBA são semelhantes.
ASP é a linguagem usada em servidor de páginas de internet, VBScript está presente em páginas de internet e no próprio Windows, VBA está presente no pacote Office, e VB é o compilador da Microsoft.

Aqui uma das rotinas que uso no meu webservice de CEP.

SUB BuscaCepSql( cpCep, cpEndereco, cpBairro, cpCidade, cpUf, cpInfInc)
   DIM Conexao, Registro
   DIM cSql
   SET Conexao = Server.CreateObject("ADODB.Connection")
   Conexao.Open "Driver={MySQL ODBC 5.1 Driver}; DATABASE=database; SERVER=server; UID=usuario; PASSWORD=senha;"
   SET Registro = server.CreateObject("ADODB.Recordset")
   cSql = "SELECT * FROM JPCEP WHERE CPCEP = '" + cpCep + "'"
   Registro.Open cSql, Conexao
   IF NOT Registro.Eof THEN
      cpEndereco = Registro.Fields("CPENDERECO").Value
      cpEndereco = Rtrim(Ltrim(cpEndereco))
      cpBairro = Registro.Fields("CPBAIRRO").Value
      cpCidade = Registro.Fields("CPCIDADE").Value
      cpUf = Registro.Fields("CPUF").Value
      cpInfInc = Registro.Fields("CPINFINC").Value
   END IF
   IF cpInfInc < "2012/07/17 22:36" THEN
      cpInfInc = "0000/00/00"
   END IF
   Registro.close
   SET Registro = Nothing
   Conexao.Close
   SET Conexao = Nothing
END SUB


E a equivalente em Harbour

FUNCTION BuscaCepSql( cpCep, cpEndereco, cpBairro, cpCidade, cpUf, cpInfInc)
   LOCAL Conexao, Registro
   LOCAL cSql
   Conexao := win_OleCreateObject("ADODB.Connection")
   Conexao:Open( "Driver={MySQL ODBC 5.1 Driver}; DATABASE=database; SERVER=server; UID=usuario; PASSWORD=senha;" )
   Registro := win_OleCreateObject("ADODB.Recordset")
   cSql := "SELECT * FROM JPCEP WHERE CPCEP = '" + cpCep + "'"
   Registro:Open( cSql, Conexao )
   IF .NOT. Registro:Eof()
      cpEndereco := Registro:Fields("CPENDERECO"):Value
      cpEndereco := Rtrim(Ltrim(cpEndereco))
      cpBairro := Registro:Fields("CPBAIRRO"):Value
      cpCidade := Registro:Fields("CPCIDADE"):Value
      cpUf := Registro:Fields("CPUF"):Value
      cpInfInc := Registro:Fields("CPINFINC"):Value
   ENDIF
   IF cpInfInc < "2012/07/17 22:36"
      cpInfInc := "0000/00/00"
   ENDIF
   Registro:close()
   Conexao:Close()
   RETURN NIL


Só mesmo pequenas diferenças entre as linguagens de programação.
Mas a parte de ADO é praticamente idêntica.
Tudo isso está disponível no Windows, incluindo o ADO, é só usar.

Só pra mostrar que o ADO é isso, não importa qual seja a linguagem de programação.
E se a escolha for pela quantidade de pessoas que usam ADO... não dá pra considerar apenas os usuários Harbour.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Harbour (ou xHarbour) BASICO com MYSQL

Mensagempor JoséQuintas » 01 Jun 2015 06:20

Só pra lembrar:
Pode usar ADO com DBFs também.
Ao invés/além de instalar o "driver" ( odbc ) pra MySQL, pode instalar do ADS, e usar ADS Local.
Só altera a string de conexão.
A partir daí, pode usar comandos SQL normalmente para DBFs.
Assim, aprende por etapas, começando por ADO + SQL em DBFs, e depois altera pra MySQL só trocando a string de conexão, e ajustando alguma particularidade do MySQL.

São três coisas distintas:
- ADO que se comunica com qualquer tipo de banco de dados, ou alguma biblioteca que pode ou não usar ADO
- Comandos SQL, que podem ser usados com qualquer tipo de banco de dados, ou biblioteca que use comandos SQL
- MySQL (uso cliente/servidor)

ADO trabalha com "arquivo temporário em memória" no padrão ADO.
Algumas bibliotecas do Harbour convertem esse arquivo temporário pra DBF.

A classe MySql mais antiga no Harbour converte em um tipo um array, e se comunica usando as DLLs do MySql.
Era muito recomendada antigamente, mas deixou de ser, apesar de continuar existindo.
Pra base de dados e pra parte gráfica, as opiniões no Harbour se dividem, como já deve ter percebido.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10018
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 641 vezes

Anterior



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro