Clipper On Line • Ver Tópico - Comando SQL x XBASE
Página 1 de 5

Comando SQL x XBASE

MensagemEnviado: 07 Jan 2015 20:44
por janio
Pessoal,

Uso ha alguns anos com sucesso o Mediator para Mysql! O legal desse RDD, assim como de outros semelhantes, eh que eles nos dão a oportunidade de escolher se continuamos usando comando xbase ou sql. Comecei minha vida de programação com xbase e este eh para mim a oitava maravilha do mundo. Ocorre parece haver em nós um certo complexo de inferioridade qndo usamos comandos xbase e achamos q aqueles q usam comandos sql estão em outro nivel, outro patamar, que deixou coisas "velhas" e agora ta na "modernidade".

Pois bem! Resolvi trocar os comandos xbase em alguns relatorios para sql. O resultado foi destroso qndo testei em uma base de dados mediana. Sql comeu poeira: 52 segundos para mostrar o relatorio na tela! Ja qndo usei comandos xbase... 2 segundos! eh uma diferença enoooooormeeeeeee!

Pode ser pq eu nao domine sql... quem sabe! Pode ser tbm que tenha a ver como os meus índices estao criados. Sinceramente, não sei. O que sei eh q de 52 segundos para apenas 2... eh de estranhar!

Em Sql
   cQuery = "SELECT a00ecf.marecf, a00ecf.nrfecf, a00ecf.identi, " + ;
            "SUM(a03ped.TOTPED) as Total " + ;
            "FROM a03ped " + ;
            "INNER JOIN a00ecf ON ( a03ped.ecfnrf=a00ecf.nrfecf ) " + ;
            "WHERE a03ped.is_deleted = 'N' AND a03ped.flgcan='N' AND a03ped.datemi>='&vDataI_' AND a03ped.datemi<='&vDataF_'" + ;
            "GROUP BY a03ped.ecfnrf"

   GERA_TAB()      
   use &dbftmp as cQuery NEW SCROLLABLE
   DbGoTop()
   
   Do While !Eof()
   
      nTotalGeral += total

      @ PROW() + 01, 01 SAY NRFECF
      @ PROW()     , 23 SAY Left(MARECF,15)
      @ PROW()     , 45 SAY IDENTI
      @ PROW()     , 66 SAY Total         Pict "@E 99,999,999.99"
   
      DbSkip()
      
   Enddo

   Use
    
   @ PROW() + 01, 50 SAY "Total --->>>"
   @ PROW()     , 65 SAY nTotalGeral     Pict "@E 999,999,999.99"


Em xBase
   aCampos := {} 
   aAdd( aCampos , { "NRFECF" , "C" , 21 , 0 } )
   aAdd( aCampos , { "MARECF" , "C" , 15 , 0 } )
   aAdd( aCampos , { "IDENTI" , "C" , 15 , 0 } )
   aAdd( aCampos , { "TOTAL"  , "N" , 15 , 2 } )

   dbCreate( "mem:test", aCampos, "DBFCDX" , .T., "memarea" )

   INDEX ON NRFECF TAG CHAVE1

   SELECT PEDIDO
   DBSETORDER(7)
   DBGOTOP()
   OrdScope( 0, Dtos(vDATAi) )
   OrdScope( 1, Dtos(vDATAf) )
   DBGOTOP()
   Do While !Eof()
     
      If FlgCan = "S"
         DbSkip()
         Loop
      Endif

      If EcfFab != pedido->ecfnrf
         Select Ecf
         DbSetOrder(2)
         DbGoTop()
         DbSeek( pedido->ecfnrf )
      Endif
      
      EcfFab = pedido->ecfnrf
      
      Select MemArea
      DbAppend()
      replace NRFECF with pedido->ECFNRF ,;
              MARECF with ecf->marecf    ,;
              IDENTI with ecf->identi    ,;
              TOTAL  with pedido->TOTPED
         
      Select Pedido
      DbSkip()
         
   Enddo
         
   OrdScope( 0, nil )
   OrdScope( 1, nil )

   Select MemArea
   DBSETORDER(1)     
   GOTO TOP   
   Do While !Eof()
   
      xEcf = NrfEcf
      xTotal = 0

      @ PROW() + 01, 01 SAY NRFECF
      @ PROW()     , 23 SAY Left(MARECF,15)
      @ PROW()     , 45 SAY IDENTI
      
      Do While xEcf = NrfEcf
      
         xTotal = xTotal + Total
         
         DbSkip()
         
      Enddo

      nTotalGeral += xtotal

      @ PROW()     , 66 SAY xTotal         Pict "@E 99,999,999.99"
         
   Enddo
    
   Close memarea
     dbDrop( "mem:test" )  // Free memory

   @ PROW() + 01, 50 SAY "Total --->>>"
   @ PROW()     , 65 SAY nTotalGeral     Pict "@E 999,999,999.99"


Indices
            INDEX ON PEDIDO                           TAG CHAVE1
            INDEX ON STR(CODCLI)+DTOS(DATEMI)         TAG CHAVE2
            INDEX ON FLGIMP                           TAG CHAVE3
            INDEX ON STR(CODVED)+DTOS(DATEMI)         TAG CHAVE4
            INDEX ON STR(CODPRZ)+DTOS(DATEMI)         TAG CHAVE5
            INDEX ON STR(CODCLI)+DESCEND(STR(PEDIDO)) TAG CHAVE6
            INDEX ON DTOS(DATEMI)                     TAG CHAVE7
            INDEX ON ECFNRF+Dtos(EMIDAT)+Str(COONUM)  TAG CHAVE8

Comando SQL x XBASE

MensagemEnviado: 07 Jan 2015 21:02
por janio
Esclarecendo:

A tabela teste tem quase UM MILHAO de registros! Porém eu pedi o relatorio de apenas uma data que tem cerca de 3000 registros!

Comando SQL x XBASE

MensagemEnviado: 07 Jan 2015 21:56
por alxsts
Olá!

Qual gerenciador de banco de dados você usa?

Comando SQL x XBASE

MensagemEnviado: 08 Jan 2015 09:55
por janio
Ola,

HeidSql 8.3

Comando SQL x XBASE

MensagemEnviado: 08 Jan 2015 11:12
por Poka
Janio, falando em velocidade, estou começando a mexer com Firebird + odbc.
Fiz um teste simples somente criando uma tabela com campo codigo e inserindo 100.000 registros. No Firebird demora +- 3 minutos, no Harbour+dbf 3 (TRES) SEGUNDOS.

Poka.

Comando SQL x XBASE

MensagemEnviado: 08 Jan 2015 23:25
por alxsts
Olá!

HeidiSQL é uma ferramenta para manejo e administração de bancos de dados.

Um Sistema Gerenciador de Banco de Dados Relacional (SGBDR) é o software que gerencia suas instâncias nos servidores.

Com o HeidiSQL, você pode manejar instâncias dos SGBDRs MySQL e MS SQL Server.

Qual delas você está utilizando?

Comando SQL x XBASE

MensagemEnviado: 09 Jan 2015 08:59
por janio
Oxente,

Na primeira msg deixei claro que uso MYSQL!

Janio

Comando SQL x XBASE

MensagemEnviado: 09 Jan 2015 11:28
por Itamar M. Lins Jr.
Esta velocidade é lenda.
Na época tudo era DBF ou COBOL, o SQL era para os eleitos... até onde sei no COBOL era criado tudo pelo programador não tinha RDD
Era melhor quando em rede PONTO a PONTO o pessoal do SQL ria dos DBF´s corrompia indices uma bagunça, estragava o HEAD do DBF etc...
Mas era uma questão da arquitetura CLIENTE/Servidor, não um problema do DBF em si, depois com o ADS, CACHÉ e outros com uso via TCP/IP parou esses problemas.
o Dbf é rápido para o propósito que foi feito, não perde p/ SQL, o problema é que não tinha os motores (LetoDB, NetIO...) para DBF em rede.
Agora podemos discutir no bom sentido os comandos do SQL que não tem no DBF, mas que não é uma limitação do DBF e sim dos motores(daemons) no ADS podemos usar sintaxe SQL... o pessoal sente falta dos INNER JOINS... mas como tudo tem os prós e contras. Eu por exemplo não fico com desdém de quem usa DBF eu uso, tem muita gente usando SQL e não sabe metade das coisas de quem usa DBF. Por exemplo criando campos desnecessários gigantes, abusando dos processadores, megalomaníacos do SQL..., compram o RDDSQL e depois são ensinados a remover, os "Do wihile" por "SELECT", "REPLACE" por "UPDATE" e assim vão trocando tudo por SQL, era melhor usar logo SQLMIX que é gratuito, ou ADO entre outros. Porque não adianta só colocar duas linhas e dizer agora eu uso SQL, é preciso fazer toda uma adaptação, remodelar tudo para tirar proveito e se não fazer isso não adianta. No meu ponto de vista é redundância, usar conversor de sintaxe DBF p/ SQL, é comprar Ferrari p/ andar em estrada de barro.

A manutenção do MySQl, Postgree não se compara com DBF, para quem sabe trabalhar com DBF, está cada vez mais difícil abandona-los temos boas ferramentas.

Dois top de linha que usam DBF

http://www.intersystems.com/our-products/cache/cache-overview/
http://scn.sap.com/community/ads

Pena que são caros.

Eu vou de LetoDB por enquanto.

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 09 Jan 2015 12:46
por janio
Nao posso dizer que sei programar e muito menos que 'sei' trabalhar com dbf, até pq programo por hobby e não como meio de vida.

Mas desde comecei com este negocio q NUNCA tive índices corrompidos, nunca tive perda de dados... nunca tive problemas nenhum com dbf. Fui para MySql com Mediator por justamente achar q quem usa dbf ta 'atrasado'. Nessa época não tinha o LetoDB e nem esse negocio de criar dbf na memoria, isso eh o maximo!

Se fosse hj continuaria com dbf em todos os meus sistemas!

Mininuuuu tu precisa ver o que eh sofrimento eh qndo precisamos restaurar algum backup em mysql. Pelo amor de Deus! Eh o dia inteirim recriando os índices, enquanto q o mesmo serviço, se em dbf fosse, seria alguns minutos.

Janio

Comando SQL x XBASE

MensagemEnviado: 09 Jan 2015 16:36
por frazato
Boa tarde! também faço parte de pessoal que já inicie o processo de mudar de DBf para SQL usando na epoca o MEDIATOR, ficou muito lento na época e acabei desistindo, hoje tenho um sistema de ERP para supermercado com base DBF/CDX com mais de 12 milhões de registro e um 1gb de tamanho sem nenhum problema de indice ou velocidade, uso atualmente GTWVW e xharbour 0.99.70 todos os terminais fazem acesso remoto usando o GO-Global com velocidade muito rápida tanto pra consulta quanto para geração de relatórios.

Tenho um terminal de cotação online para digitação de preço fora do mercado usando LETODB ( fantástico) muito rápido, baste apenas pegar as funções e gerar um executável aparte usando o LETODB+harbour e libere o acesso ao servidor pela porta compartilhando os dados locais ou seja tenho um terminal 100% online.

Nunca tive problema de quebra de indice ou perda de dados. Tive que fazer ajustes no sistema pra trabalhar usando GO-Global, imagine que você tem vários usuarios usando ao mesmo tempo a mesma maquina, no meu caso crie pastas temporarias de acordo com a variavel de usuario.

Todo a parte de configuração e montagem do servidor foi feita por uma amigo meu de São josé dos campos ( Matriz nossa ) a parte de impressão e normal, gero o arquivo txt de sai e depois imprimo ou pela ltp ou pelo win_prn.

Frazato

Comando SQL x XBASE

MensagemEnviado: 12 Jan 2015 11:21
por paiva
BOM dia.

Gostaria de tirar uma DUVIDA. Referente ao tema.

Pessoalmente uso em TODOS os clientes o TS (2003 2008) OU um programa gerenciador de MULTI TASK que funciona em xp W7 etc http://deepxw.blogspot.com.br/2009/04/u ... patch.html

em REDE o sistema fica uma carroça por este motivo Não utilizo desta forma.

DUVIDA em LETODB ou NETBIOS ou outros como funcionam de FATO ?

ex: se acesso pela rede uma base GRANDE e vou lendo reg a reg e montando um relatório,
os registros UM a um NAO seriam transportados para o TERMINAL para o Prg selecionar e ver o que fazer com ele ?

SOMENTE seria processado no servidor ALGUNS comandos ? Tipo reindexação

SE tiver uma forma OTIMA para usar em rede usando algum desses produtos, Poderia coexistir na forma de acesso por TS e por este produto em REDE ?

Desde já agradeço

Comando SQL x XBASE

MensagemEnviado: 12 Jan 2015 11:59
por rochinha
Amiguinhos,

Janio, como você tem certeza que mesmo usando o Mediator, no momento da filtragem é este RDD que está ativo?

O RDDCDX por natividade pode estar sendo carregado e atrapalhando o RDD Mediator. Quando voce comanda USE arquivo INDEX indice TAG nometag, este comando está mesmo sendo usado pelo RDD Mediator?

O fato de levar menos tempo, pode ser o RDD nativo trabalhando.

Comando SQL x XBASE

MensagemEnviado: 12 Jan 2015 12:20
por janio
Rochinha,

Acho q vc não entendeu... minha base de dados eh MySql, ok? Como uso Mediator, posso usar comandos xbase ou fazer as consultas diretamente em comandos sql (Select *).

Postei dois exemplos: Um usando SELECT * FROM bla bla, Outro usando nosso velho Do While (lendo registro a registro). Nas duas maneira a base eh a mesma (MySql), mas na segundo crio um dbf temporário pra facilitar a organização dos dados!

Janio

Comando SQL x XBASE

MensagemEnviado: 13 Jan 2015 18:41
por JoséQuintas
No SELECT de datas, tem que colocar a data no formato do MySql.
Pra facilitar uso algumas funçõeszinhas, por exemplo, DateSql().

cSql := "SELECT * FROM banco WHERE data > " + Quoted( DateSql( Data ) )

FUNCTION Quoted( cString )
   RETURN [']  + cString + {'}

FUNCTION DateSql( dData )
   IF Empty( dData )
       // mysql strict mode
       RETURN "NULL"
       // RETURN Quoted( "0000-00-00" )
   ENDIF
   RETURN Quoted( Transform( Dtos( dData ), "@R 9999-99-99" ) )


Sobre velocidade:
No MySql ou qualquer banco server, tudo funciona até mesmo sem índice.
Se houver índice que agilize a pesquisa, o MySql vai fazer uso dele.
Então pra agilizar é criar índices.

E se usar registro a registro, tipo do while .not. eof(), aí não tem server que deixe rápido.
Tente fazer um SELECT que traga tudo o mais pronto possível.

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 15:38
por Karine Lima Almeida
Olá,

Janio, gostaria de saber se você conseguiu resolver o problema da lentidão do sql X comando xbase. Pois enfrento esse mesmo problema!
Minhas querys em sql levam em torno de 12 segundos para um arquivo de 1 milhão de registros, sendo que usando sintaxe xbase, levam 1,5 segundo.
Quando ultilizo somente "Use as "select *" sem o : NEW SCROLLABLE , é um pouco mais rápido, só que eu não posso usar "skip -1", :/
Enfim, tudo tem " um porém" no Mediator pra mim!

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 15:49
por sygecom
O simples fato de nao ter uma relação de chave primaria e estrangeira no DBF já é um grande motivo para migrar para SQL com tudo bem amtrado.

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 16:04
por Karine Lima Almeida
sygecom, me desculpe, mas não entendi, o que vc sugere?

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 16:12
por alxsts
Olá!

Seja bem-vinda ao fórum Karine!

Como devem saber, em um SGBD a performance está intimamente ligada ao modelo de dados. Como estão os índices das tabelas usadas nesta consulta, se é que existem? Procure criar índices nas tabelas para as colunas envolvidas na cláusula WHERE.

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 16:30
por Karine Lima Almeida
Olá alxsts, eu tenho indices na tabela sim, são esses:

indices.png

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 17:23
por alxsts
Olá!

Pode postar o comando SQL?

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 17:50
por Karine Lima Almeida
USE tab AS "select * from MEDIATOR.GRUPOS t where exists ( select recno from MEDIATOR.DBTMARK where recno = t.recno )" PERMANENT

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 18:19
por JoséQuintas
Se entendi direito, o comando vai fazer 1 milhão de pesquisas.

Apenas tentativas:

SELECT * FROM GRUPOS WHERE recno IN ( SELECT RECNO FROM DBTMARK )

Pelo menos ao invés de pesquisar cada código, carregaria uma lista. (dependendo do tamanho da segunda tabela)

SELECT * FROM GRUPOS LEFT JOIN DBTMARK ON GRUPOS.RECNO = DBTMARK.RECNO

De qualquer jeito, no mínimo o servidor vai percorrer 1 milhão de registros, e depende da estrutura.
Por exemplo, tabelas com TEXT com muito conteúdo, é demorado.

E dependendo do tamanho do resultado, vai precisar muita memória no servidor.

Difícil imaginar aonde usaria esse resultado, caso seja 1 milhão de registros.

Aliás... se quer saber os códigos que existem em dbtmark, não seria mais prático...

SELECT DISTINTIC RECNO FROM DBTMARK

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 18:27
por alxsts
Olá!

Experimente este:
USE tab AS "SELECT * FROM MEDIATOR.GRUPOS t JOIN (SELECT recno FROM MEDIATOR.DBTMARK) t1 ON t.recno = t1.recno)" PERMANENT
É recomendável não usar
SELECT * FROM ...
Prefira nomear as colunas:
SELECT col1, col2 ... coln FROM tabela...


Obs:
- não testei o SQL acima. Pode haver erros...
- não conheço Mediator.
- se persistir a lentidão, faça um teste com ADO em um programa separado, para medir a performance e comparar.

Comando SQL x XBASE

MensagemEnviado: 15 Jun 2015 18:32
por JoséQuintas
Complementando:
Se a intenção é pegar os dados da primeira tabela, com código cadastrado na segunda, pode ser interessante inverter, caso a segunda tabela seja menor.

SELECT [lista de campos] FROM DBMARK INNER JOIN GRUPOS ON DBMARK.RECNO = GRUPOS.RECNO

Desta forma já tem os códigos que interessam, e só pesquisa os dados na primeira tabela.

Supondo que a primeira tabela tenha um milhão de registros, e a segunda tenha apenas um, vai substituir um milhão de pesquisas por apenas uma.

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 08:32
por Karine Lima Almeida
Olá pessoal, obrigada pelas dicas, vou fazer os testes!

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 10:09
por janio
Karine,

Um outro teste que vc pode fazer qndo notar alguma lentidão eh fazer a consulta no seu banco pelo HeidSql e ver qnto tempo levou... e depois fazer a mesma consulta pelo mediator e verificar se houve diferença no tempo de processamento.

Dessa forma da pra ter uma ideia de onde está o problema!

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 10:32
por paiva_dbdc
BOm dia.

testei varias vezes com Mysql, Fire e Postgres e realmente ta difícil mudar do DBF.

Mais rápido, MUITO mais simples etc etc.

uso tudo em TS.

MAIS a minha duvida é sobre uma informação que tive.

me falaram que mesmo em DB existe problema de Índices e que o IDEAL seria não usar índices.
mais se não houver índices as Pesquisas seriam + lentas então seria tipo uma sinuca de bico (rs)

ou este problema de índice é devido ao PRODUTO que a pessoa esta usando e que relatou este fato ?

PAiva

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 11:37
por Karine Lima Almeida
janio,

então é assim,
USE qry AS "SELECT * FROM MEDIATOR.GRUPOS WHERE SITUACAO='1' order by CIDADE " // SEM O SCROLLABLE APENAS 1,5 SEGUNDOS

//45,623 total registros
-----------------------------------------------------
USE qry AS "SELECT * FROM MEDIATOR.GRUPOS WHERE SITUACAO='1' order by CIDADE " SCROLLABLE // com SCROLLABLE cerca de 19 segundos.

//45,623 total registros

eu não tenho duvidas de que é o SCROLLABLE que torna o resultado mais lento, porém se eu não usa-lo, INDEXKEY() não é definido, o skip -1 não funciona, entre outras funções que deixam de funcionar.

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 12:39
por Itamar M. Lins Jr.
Bom se, é assim, vai cair naquela mesma coisa que eu já falei aqui... Lógica do DBF nos SGBD´s da vida, é um problema a longo prazo.
Seria bom ver isso com SQLMIX, já que não usa nada disso que o pessoal do Mediator usa.
As poucas consultas que fiz usando SQLMIX foram praticamente instantâneas.

É o caso das outras coisas que essas lógicas tem que fazer, DELETED, RECNO, RLOCK, ETC... tudo isso tem que ser verificado, criado, atualizado... ai fica mais lento.

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 13:34
por alxsts
Olá!

Qual seria a necessidade do DbSkip(-1)? Teu sistema roda em Windows ou Linux/Unix?

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 14:00
por Karine Lima Almeida
alxsts, então o sistema não é meu, é da empresa onde eu trabalho, e sim, o sistema roda nas duas plataformas, foi desenvolvido usando GASPRO.
Com sintaxe clipper, fizemos a conversão a pouco tempo para Harbour, já estamos trabalhando no desenvolvimento de harbour +qt.
Tenho que ser sincera, eu não conheco muito a linguagem clipper e nem harbour, o pouco que conheci foi estudando hbqt, que é a junção de harbour + qt, e a forma de se programar é um tento diferente.

o trecho do sistema onde uso o skip -1
chv_=&("{||"+INDEXKEY(0)+"=["+;           // so servem os registro que
IF(EMPT(criterio),"","T")+chv_1+"]}")*//// atendao ao filtro/relacao

DO WHILE !EOF() .AND. !BOF() .AND.;       // pula qtos reg's forao pedidos
a_pular != ja_pulado //.AND. EVAL(chv_)  // ate eof ou fora filtro/relacao
  IF a_pular > 0                           // pulando para frente
   SKIP
   ja_pulado++                             // conta quando foroa pulados
  ELSE                                     // pulando para traz
   SKIP -1

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 15:06
por alxsts
Olá!

Parece a função Skipper de um TBrowse...

Se trabalhasse apenas com Windows, ia te sugerir usar ADO mas, não é o caso. Creio que, por hora, reste apenas a sugestão do Itamar, para testar com SQLMix.

Se vocês já estão usando Qt, creio que terão a solução usando as classes para acesso a SGBD que ela disponibiliza.

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 16:38
por Karine Lima Almeida
alxsts, se não for pedir muito teria um exemplo de como conectar ao meu banco mysql em um servidor ubunto 13.04 como sqlmix?

estou tentando isso:
IF rddInfo( RDDI_CONNECT, { "ODBC", "192.168.1.1", "root", , "XXXX" } ) == 0
? "Unable connect to the server"
RETURN
ENDIF

mas não conecta.

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 18:38
por sygecom
Karine,
Não muda nada a parte de conexão se o Mysql está no Windows ou Linux, talvez seu problema esteja na configuração do Mysql no Linux, tentou acessar por um phpamin da vida para ver se de fora consegue conectar no Mysql ?

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 19:04
por alxsts
Olá!

Aparentemente o código de conexão que você postou está ok:
IF rddInfo( RDDI_CONNECT, { "ODBC", "192.168.1.1", "root", , "XXXX" } ) == 0
? "Unable connect to the server"
RETURN
ENDIF
Suponho que você tenha o MySQL Conector instalado. Na linha do IF acima, troque "ODBC" por "MYSQL" e teste.

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 20:36
por Itamar M. Lins Jr.
Ola!
É o seguinte:
Com SQLMIX temos duas formas de acesso. Via ODBC e nativo!
Já testei aqui e funciona 100%
Nativo, test1.prg
#require "rddsql"
#require "sddmy"

#include "dbinfo.ch"
#include "error.ch"

REQUEST SDDMY
REQUEST SQLMIX

ANNOUNCE RDDSYS

FIELD RESIDENTS

PROCEDURE Main()

#if defined( __HBSCRIPT__HBSHELL )
   rddRegister( "SQLBASE" )
   rddRegister( "SQLMIX" )
   hb_SDDMY_Register()
#endif

   rddSetDefault( "SQLMIX" )

   ? "RDDs:"; AEval( rddList(), {| x | QQOut( "", x ) } )

   IF rddInfo( RDDI_CONNECT, { "mysql", "localhost", "root","senha_do_root", "test" } ) == 0 // test é o DB que vem por padrão no Mysql.
      ? "Could not connect to server", rddInfo( RDDI_ERRORNO ), rddInfo( RDDI_ERROR )
      RETURN
   ENDIF

   CreateTable()

   ? "Let's browse table (press any key)"
   Inkey( 0 )
   dbUseArea( .T., , "SELECT * FROM country", "country" )
   Browse()

   ? "Let's browse table ordered by resident count (press any key)"
   Inkey( 0 )
   INDEX ON field->RESIDENTS TAG residents TO country
   Browse()

   dbCloseAll()

   RETURN

STATIC PROCEDURE CreateTable()

   ? rddInfo( RDDI_EXECUTE, "DROP TABLE country" )
   ? rddInfo( RDDI_EXECUTE, "CREATE TABLE country (CODE char(3), NAME char(50), RESIDENTS int(11))" )
   ? rddInfo( RDDI_EXECUTE, "INSERT INTO country values ('LTU', 'Lithuania', 3369600), ('USA', 'United States of America', 305397000), ('POR', 'Portugal', 10617600), ('POL', 'Poland', 38115967), ('AUS', 'Australia', 21446187), ('FRA', 'France', 64473140), ('RUS', 'Russia', 141900000)" )

   RETURN

E via ODBC test2.prg:
#require "rddsql"
#require "sddodbc"

#include "simpleio.ch"

REQUEST SQLMIX, SDDODBC

PROCEDURE Main()

   LOCAL nConnection, nI, aI

#if defined( __HBSCRIPT__HBSHELL )
   rddRegister( "SQLBASE" )
   rddRegister( "SQLMIX" )
   hb_SDDODBC_Register()
#endif

   Set( _SET_DATEFORMAT, "yyyy-mm-dd" )

   rddSetDefault( "SQLMIX" )
   nConnection := rddInfo( RDDI_CONNECT, { "ODBC", "Server=localhost;Driver={MySQL ODBC 5.3 Unicode Driver};dsn=;User=root;Pwd=SUA_SENHA;database=test;" } ) //Não precisa do DSN é opcional
   IF nConnection == 0
      ? "Could not connect to server", rddInfo( RDDI_ERRORNO ), rddInfo( RDDI_ERROR )
      RETURN
   ENDIF
   ? nConnection
   ? rddInfo( RDDI_EXECUTE, "DROP TABLE country" )
   ? rddInfo( RDDI_EXECUTE, "CREATE TABLE country (CODE char(3), NAME char(50), RESIDENTS int(11))" )
   ? rddInfo( RDDI_EXECUTE, "INSERT INTO country values ('LTU', 'Lithuania', 3369600),('USA', 'United States of America', 305397000), ('POR', 'Portugal', 10617600), ('POL', 'Poland', 38115967), ('AUS', 'Australia', 21446187), ('FRA', 'France', 64473140), ('RUS', 'Russia', 141900000)" )
   ? dbUseArea( .T., , "SELECT * FROM country", "country" )
   ? "LASTREC:", LastRec()
   DO WHILE ! Eof()
      aI := Array( FCount() )
      FOR nI := 1 TO FCount()
         aI[ nI ] := FieldGet( nI )
      NEXT
      ? RecNo(), hb_ValToExp( aI )
      dbSkip()
   ENDDO
   ? "LASTREC:", LastRec()
   dbCloseAll()

   RETURN

C:\fontes\teste>test2

         1
.T.
.T.
.T.
.T.
LASTREC:          1
         1 {"LTU", "Lithuania", 3369600}
         2 {"USA", "United States of America", 305397000}
         3 {"POR", "Portugal", 10617600}
         4 {"POL", "Poland", 38115967}
         5 {"AUS", "Australia", 21446187}
         6 {"FRA", "France", 64473140}
         7 {"RUS", "Russia", 141900000}
LASTREC:          7
C:\fontes\teste>


PS.Estou usando harbour 3.4, Mingw 5.1, compilei o Harbour agorinha e instalei o MySQL 5.6 antes de compilar!
Setar o PATH para a DLL do MYSQL quando for acesso nativo.
C:\Program Files\MySQL\MySQL Server 5.6\lib;

Setar a Variavel do Harbour p/ achar e criar as libs do MySQL.
HB_WITH_MYSQL=C:\Program Files\MySQL\MySQL Server 5.6\include


Simples assim! ;-)

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 16 Jun 2015 20:57
por Itamar M. Lins Jr.
E tem gente querendo colocar na cabeça dos outros que ADO é mais simples do que isso ?

   IF rddInfo( RDDI_CONNECT, { "mysql", "localhost", "root","mysql", "test" } ) == 0
      ? "Could not connect to server", rddInfo( RDDI_ERRORNO ), rddInfo( RDDI_ERROR )
      RETURN
   ENDIF

ou isso?
   ? "Let's browse table (press any key)"
   Inkey( 0 )
   dbUseArea( .T., , "SELECT * FROM country", "country" )
   Browse()

   ? "Let's browse table ordered by resident count (press any key)"
   Inkey( 0 )
   INDEX ON field->RESIDENTS TAG residents TO country
   Browse()


O que é mais intuitivo para o programador xBase ?
E quando for salvar os dados o tal CRUD!

STATIC PROCEDURE CreateTable()

   ? rddInfo( RDDI_EXECUTE, "DROP TABLE country" )
   ? rddInfo( RDDI_EXECUTE, "CREATE TABLE country (CODE char(3), NAME char(50), RESIDENTS int(11))" )
   ? rddInfo( RDDI_EXECUTE, "INSERT INTO country values ('LTU', 'Lithuania', 3369600), ('USA', 'United States of America', 305397000), ('POR', 'Portugal', 10617600), ('POL', 'Poland', 38115967), ('AUS', 'Australia', 21446187), ('FRA', 'France', 64473140), ('RUS', 'Russia', 141900000)" )

   RETURN


É mais simples do que ADO ou não é ?

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 17 Jun 2015 06:40
por JoséQuintas
E tem gente querendo colocar na cabeça dos outros que ADO é mais simples do que isso ?


Ohhhhhh

Como eu disse várias vezes, isso esconde o que realmente precisa.
E é explicação vinda de quem acha que entende.

Veja, não sou eu que estou dizendo, é o seu roteiro, que até omite algumas partes:

Precisa instalar programa pra baixar do github
Precisa baixar os fontes do Harbour
precisa baixar compilador C
precisa baixar e instalar o servidor MySQL na máquina antes de gerar o Harbour
precisa configurar harbour, compilador c, pra gerar o Harbour

seguindo o seu roteiro, talvez não funcione nos terminais, por não ter a parte de MySQL - não conheço SQLMIX

É.... mais simples que ADO....
Nem quem usa SQLMIX entende direito, só quem usa ADO mesmo reconhece as falhas do roteiro.

E tem gente que fala que SQLMIX é mais fácil
kkkkkkkkkkkkkkkkkkkkkkkkkkk

Continuo acompanhando tranquilamente.
Aqui é apenas resposta ao que destaquei no início do texto.

Eu sempre disse que o ADO é mais simples de sair usando, não depende de nada. E já postei do começo ao fim tudo que terá que ser enfrentado.
Ainda não apareceu o mesmo do SQLMIX, foram sempre partes incompletas.

Nota:
Talvez possamos supor que Linux não tem Harbour nightly, e parte do que foi omitido seja tarefa comum, mas de qualquer forma está omitido.
E como ela vai usar em Linux e Windows, o ADO pode não ser opção

Nota2:
? rddInfo( RDDI_EXECUTE, "DROP TABLE country" )


cnMySql:Execute( "DROP TALE country" )


Nossa!
Como disserarm SQLMIX é muito mais simples, ADO é complicado demais.
Como eu disse, tanto faz, não faz diferença teimar em uma coisa ou outra, melhor aproveitar a parte comum e ir em frente sem causar confusão.

Comando SQL x XBASE

MensagemEnviado: 17 Jun 2015 09:31
por Itamar M. Lins Jr.
Em menos de 8 minutos eu fiz tudo isso! Que dificuldade.
Roda no Android, Linux, etc... ADO só windows!
Olhem a sintaxe do ADO.
O Quintas não é bobo... colocou um comando só, esconde os outros... é tão esperto que acha ele que sabe mais do quem criou o SQLMIX. Acha que quem criou o SQLMIX não sabia que existia ADO. Que o rapaz criou uma ferramenta sem futuro... fala sério! Esse é problema do Quintas é cego não quer enxergar, depois fica escrevendo que eu sou xiita do Harbour, que não sei do que estou falando... Diz que o Record set, que é a malha, o retorno da consulta do ADO é a mesma coisa que um DBF... só rindo mesmo de uma afirmação dessas. Que é tudo a mesma coisa. Depois criou uma função para transformar o Record set em DBF, e lá vai ele novamente recriando tudo de novo, da maneira dele para ficar parecido com SQLMIX...

Quer porque quer mostrar que isso aqui em baixo é mais fácil de entender, para um programador xBase,

// Início do aplicativo:
Conexao():Open()

// final do aplicativo:
Conexao():Close()

// Função auxiliar
FUNCTION Conexao()
  STATIC oConexao
IF oConexao == NIL
   oConexao := win_OleCreateObject( "ADODB.Connection" )
   oConexao:ConnectionString := "Driver=" + cMySqlDriver + ";Server=" + cServer + ";Option=131072;Stmt=;" + ;
    "Database=" + cDatabase + ";User ID=" + cUser + ";Password=" + cPassword + ";"
   oConexao:CursorLocation  := adUseClient // cliente
   oConexao:CommandTimeOut  := 60 // seconds
   oConexao:ConnectionTimeOut := 60 // seconds
ENDIF
RETURN oConexao


do que uma apenas uma linha de código do SQLMIX?
IF rddInfo( RDDI_CONNECT, { "mysql", "localhost", "root","mysql", "test" } ) == 0


Ainda quer discutir que para chegar a usar isso é preciso muito trabalho ?
Se fosse mais simples, lógico que eu estaria afirmando que ADO é mais simples.... Pode ser até melhor o ADO, mas não é mais simples.
Sabe porque o SQLMIX é mais simples ? não ? então olhe o propósito do SQLMIX, estude os fontes do SQLMIX, as classes que foram criadas que poupam todo o trabalho extra que temos com ADO, tudo isso é possivel graças ao Przmek que criou a camada virtual de comunicação com todos os RDD´s.

Saudações,
Itamar M. Lins Jr

Comando SQL x XBASE

MensagemEnviado: 17 Jun 2015 10:01
por Itamar M. Lins Jr.
Esses pequenos detalhes ele não conta... né ?

Lembre-se que a string é entre aspas simples.
Como fazer se dentro da string também tem aspas simples?
Ou data. Toda hora converter a data? Mais prático criar função.
No MySql, a barra "\" indica que o próximo caractere não faz parte do comando e deve ser usado como caractere.


FUNCTION StringSql( cTexto )
cTexto := StrTran( cTexto, [\], [\\] )
cTexto := StrTran( cTexto, ['], [\'] )
cTexto := ['] + cTexto + [']
RETURN cTexto

FUNCTION DateSql( dDate )
LOCAL cTexto
cTexto := StrZero( Year( dDate ), 4 ) + "-" + StrZero( Month( dDate ), 2 ) + "-" + StrZero( Day( dDate ), 2 )
IF cTexto == "0000-00-00"
   cTexto := "NULL"
ELSE
   cTexto := StringSql( cTexto )
ENDIF
RETURN cTexto

FUNCTION NumberSql( xValue )
RETURN Ltrim( Str( xValue ) )


Com SQLMIX isso não é necessário, porque já vem tudo prontinho em DBF! Todo esse tratamento, etc o pessoal do SQLMIX trata na raiz, nas classes criadas do SQLMIX para essa finalidade.
Isso ele não expõem para os outros, esconde. Agora manda ele indexar o RecordSet do ADO ? dar um DBSEEK no RecordSet, um COPY FILE...
Olhem os comandos do ADO...
Não tem nada a ver com xBase.
cSql := "SELECT * FROM " + cTable + " LIMIT " + Ltrim( Str( nLimitStart ) ) + ", 1000"
oRs := cnMySql:Execute( cSql )
nQtdFields := oRs:Fields:Count() - 1
nQtdRec  := oRs:RecordCount()


E na cabeça dele é tudo a mesma coisa... porque ? ele não diz para os outros que já está acostumado com essa sintaxe, porque ele programa em VB!

Qual é o programador xBASE, que usa RECORDCOUNT() ? que eu saiba nós conhecemos o lastrec() ou RecCount(), ou fcount() olhem que no ADO é "fields:count() -1" para o mesmo resultado! E é a mesma coisa p/ ele...

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 17 Jun 2015 12:37
por Itamar M. Lins Jr.
Para mostrar como o rapaz é exagerado!!!

Precisa instalar programa pra baixar do github
Precisa baixar os fontes do Harbour
precisa baixar compilador C
precisa baixar e instalar o servidor MySQL na máquina antes de gerar o Harbour
precisa configurar harbour, compilador c, pra gerar o Harbour


Só precisa de 2 coisas:
1)Fontes do Harbour
https://github.com/vszakats/harbour-core/archive/master.zip

2)Setar os PATH´s da vida.
SET PATH=%PATH%;C:\Hb34\bin;C:\Mingw32\bin;C:\Program Files\MySQL\MySQL Server 5.6\lib;
SET HB_WITH_MYSQL=C:\Program Files\MySQL\MySQL Server 5.6\include
HB_INSTALL_PREFIX=C:\HB34
>\Lugar_onde_descompactou_os_fontes\win-make.exe clean install

Oh! Mais isso é muito complicado!!!
Precisa do compilador C é ? hummmm e como é que vc consegue usar o Harbour sem compilador C ?

As outras coisinhas mais, é preciso p/ qualquer situação com ADO ou SQLMIX
Não precisa de programa nenhum p/ baixar do GIT, MYSQL é necessário nas DUAS situações, e a configuração do Harbour e compilador C ? é preciso nas duas situações.

Porque isso ? O Harbour por padrão não vem com as DLL´s e libs do MySQL, até porque tem diversas versões de MySQL... Então é preciso pegar os fontes do Harbour, instalar o MySQL e criar as libs para o MySQL.

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 17 Jun 2015 18:01
por JoséQuintas
Pra conectar: servidor, usuário, senha e nome do banco de dados.
Igual nos dois.
O resto é fixo. Qual a diferença?

Um único open() e um único close() no aplicativo inteiro. Qual a complicação?

Achar que isso é complicado para o pessoal xBase....
Aí pegou pesado.

Existirem outros tipos de campos no servidor, melhor pra decidir onde agilizar.

Saber que existem caracteres que não podem ser usados.....
Quando envia um comando SQL no SQLMIX não precisa se preocupar com isso?

Se for isso, quando o cara for usar um HeidiSQL, não vai entender porque o comando não funciona.
Interessante... aí ele pede ajuda pra mexer no banco de dados que ele mesmo criou.

Comando SQL x XBASE

MensagemEnviado: 17 Jun 2015 20:27
por Itamar M. Lins Jr.
Achar que isso é complicado para o pessoal xBase....

Eu não estou desqualificando nada, se desqualifiquei, retiro o que disse.
Para mim, qualquer coisa que funcione tem sua serventia.
Agora eu uso o SQLMIX para importar dados p/ meu sistema, e em breve eu poderei usar MySQL ou outro melhor...
E pelo pouco que entendo desse assunto, eu sei que é uma coisa muito boa, leio os comentários das pessoas em todo mundo agradecendo pelo SQLMIX.

É uma coisa bem simples de entender. Para quê criar RDDADO se tem ADO ? para quê criar SQLMIX se tem ADO ? é sinal que o ADO tem suas complicações ou limitações para as pessoas do xBase.

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 18 Jun 2015 01:48
por sygecom
Karine,
Resolveu ou consegui evoluir no caso?

Comando SQL x XBASE

MensagemEnviado: 18 Jun 2015 14:44
por Itamar M. Lins Jr.
Ola!
Só mais isso aqui que passou despercebido.
Ainda não apareceu o mesmo do SQLMIX, foram sempre partes incompletas.


Falta o quê mesmo ?

Eu heimm, é tão difícil assim de entender SQLMIX ?
Está tudo ai no exemplo.
Conectar, criar,gravar...

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 18 Jun 2015 17:22
por Karine Lima Almeida
Sim, resolvi
eu ia postar ontem mas estava com problema aqui no forum,

Era permissão no mysql do servidor ubunto, resolvido com:

GRANT ALL ON *.* TO ‘nome_user’@'%’ IDENTIFIED BY ‘senha‘;

Para o banco de dados mysql poder ser acessado pela rede, é necessario fazer

uma alteração nos parametros de configuraçao em / etc / mysql / my.cnf (sem os espaços entre as /)

onde esta bind-address = 127.0.0.1 tem que alterar para bind-address =

0.0.0.0

reiniciei o mysql e deu certo.

Pessoal, eu gostaria de saber se do xbase para o SQLMIX, eu terei que mudar

muito meu codigo pra fazer as consultas nas tabelas?

Comando SQL x XBASE

MensagemEnviado: 18 Jun 2015 17:41
por Itamar M. Lins Jr.
Ola!
Consultas ? Neste caso vai precisar mudar pouco.
dbUseArea( .T., , "SELECT * FROM country", "country" )

Já vem tudo mastigadinho ai em DBF...

Agora o TAL CRUD, Create, Replace, Update, Delete. Tudo em SQL, a mesma coisa que fazemos em PHP/C#... todas as outras ferramentas(linguagens).

Entenda que o SQLMIX não simula DBF, igual ao MEDIATOR/SQLRDD. Ele traz o resultado em DBF via comandos SQL, mas para as outras coisas é preciso usar SQL.
Dai algumas pessoas usam Stored Procedures, para poupar esses códigos no sistema, deixando apenas códigos xBase nos programas e os códigos em SQL no servidor.
Técnica usada em outras linguagens...
Por isso o SQLMIX não tem as limitações destas ferramentas(Mediator/SqlRdd).

Segue explicação de como foi concebido o SQLMIX.
                    Simple SQL Interface for Harbour

1. Introduction

   Simple SQL interface implements accessing SQL query result via RDD
interface. It is not intended to be replacement for "transparent" move of
DBFCDX application to SQL world.

   I want to discuss this in more detail. Many current RDDs for SQL servers
(ex. SQLRDD from xHarbour.com) tries to make a feeling you are working with
DBF file, but not with SQL database. SQL server does not support many
features, ex. RecNo(), deleted flag, file locks, record locks. These RDDs
are emulating these features to make feeling of DBF. Deleted() function is
emulated by creating additional table columns to store delete flag. Some
"hidden system" tables are used to register locking operations and emulate
record and file locks in DBF style. The idea of SQL query is also lost. If
you do a simple loop

dbUseArea( , "select * from my_table" )
DO WHILE ! Eof()
    somefunc( FIELD->some_sql_field )
    dbSkip()
ENDDO

RDD usualy will read SQL rows in portions, let's say 100 records per query.
So, hidden queries are generated. If you are using indexes these queries
are really complicated. Let's have index on FIELD1 + Str( FIELD2 ). A seek
to value cValue1 + Str( nValue2 ) will generate a query like:

SELECT * FROM my_table
     WHERE (FIELD1 == cValue1 and FIELD2 >= nValue2) or FIELD1 > cValue1
     ORDER BY FIELD1, FIELD2, _RECNO
     LIMIT 100

After evaluation of first 100 cached records, next query will be generated:

SELECT * FROM my_table
     WHERE (FIELD1 == cLastField1 and FIELD2 == nLastValue2 and _RECNO > nLastRecno) or
           (FIELD1 == cLastField1 and FIELD2 > nLastValue2) or
           FIELD1 > cLastValue1
     ORDER BY FIELD1, FIELD2, _RECNO
     LIMIT 100

To optimize these queries the SQL index expresion should be
"FIELD1,FIELD2,_RECNO", but not "FIELD1,FIELD2" as written in INDEX ON
command.

   "Simple SQL interface" is too long to repeat every time I want to
address this library. I'll also use acronym "SSI" to address it.

   The idea of SSI is different. It does not make hidden queries. All
queries should be made explicitly by programmer. SSI gives access to query
result via RDD interface, it does not tries to emulate DBF and be
"plug-and-play" solution for DBF to SQL migration. If you do

dbUseArea( , "select * from my_table")

all query (it could contain millions of records!) will be cached.

   The features of SSI approach are:

- It's possible to access SQL database of other applications. Other
applications usualy does not follow agreement of "plug-and-play" SQL drivers
about additional DELETED column, _RECNO in the end of index expression, etc.
Access of SQL database of other applications is sometimes not possible.

- It's query oriented. That means a simple DO WHILE ! Eof() loop will iterate
each records once and only once. This is not true for "plug-and-play" SQL
drivers, if indexing is used. Just like in the case of loop over DBF file.
It is not guaranteed that all records are included! Yes! If key value of the
first record in index is changed to be the last record in index during the
phase of record processing, DO WHILE ! Eof() loop will iterate only this
single records even if the database contains millions of records. Your sould
do FLock() on DBF to guarantee the records are not changed. Do you use FLock()
before readonly DO WHILE ! Eof() loops? :)

2. Architecture

             +-------------+
             |             |
             | SQLMIX RDD  |
             |             |
             +-------------+
                  |  ^
                  V  |
             +-------------+    +---------+
             |             |--->|         |
             | SQLBASE RDD |    |   SDD   |
             |             |<---|         |
             +-------------+    +---------+

   SQLBASE RDD implements basic functionality for accessing SQL query result
via RDD interface. This RDD could be used, if indexing of query result is not
necessary or all indexing is done by SQL server (by using ORDER BY clause).

   SQLMIX RDD implements indexing of query result. This indexing is not
related to SQL server ORDER BY clause. SQLMIX do indexing of the query on the
client side.

   SDD is acronym for Sql Database Driver. RDD is used to implement access
of different database formats like DBF, SDF, etc. SDD is used to implement
access of different SQL databases. Every SQL server (MySQL, PostgreSQL, etc.)
has a corresponding SDD. SDD driver implements a specific part of data
exchange interface between SQLBASE and SQL server.

3. Modifying database

   SSI presents a query result via RDD interface and generates no hidden
SQL queries. So, how database can be changed? Does dbAppend() and FieldPut()
works, or is it readonly SQL interface?
   dbAppend(), FieldPut() and other similiar functions work on cached query
result, i.e. query can be appended by new rows and field values can be
changed, but SQL database is not changed. dbCreate() function can also be
used to create an "empty query result" but no table is created on SQL server.
So, SSI can also be used as implementation of "array RDD".
   The programmer must call SQL command explicitly to modify SQL tables.
SSI provides a method to detect which cached rows was changed or appended.


Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 18 Jun 2015 17:53
por Karine Lima Almeida
entendi Itamar,
só que por exemplo eu carrego uma TBROWSE, ai eu vou adicionando os valores as suas respectivas colunas, so que ele carrega todos os campos no select * tabela
existe algum parâmetro para ele ignorar o RECNO e o IS_DELETED.
e ainda tem como importar um dbf para mysql com alguma ferramenta do SQLMIX. (é que essas opções são disponíveis no Mediator)
uma duvida o "set index to" não funciona , tentei e não consegui.

obrigada a todos pela ajuda estou gostando muito do sqlmix.

Comando SQL x XBASE

MensagemEnviado: 18 Jun 2015 18:39
por janio
só que por exemplo eu carrego uma TBROWSE, ai eu vou adicionando os valores as suas respectivas colunas, so que ele carrega todos os campos no select * tabela
existe algum parâmetro para ele ignorar o RECNO e o IS_DELETED


Imagino q neste caso vc deve chamar apenas os campos q desejar mostrar no browse!

Select campo1, campo2, campo3... From tabela

e ainda tem como importar um dbf para mysql com alguma ferramenta do SQLMIX. (é que essas opções são disponíveis no Mediator)


Ja testou...

Use SeuDbf New Alias SeuAlias via "DBFCDX"

Select SeuAlias
DbGoTop()
Do While !Eof()
insere dados na tabela mysql
dbskip()
Enddo

uma duvida o "set index to" não funciona , tentei e não consegui.


Em consultas SQL nao eh necessario setar o indice como fazemos no harbour. Ele automaticamente procura pelo índice que mais se adapta a sua consulta

Comando SQL x XBASE

MensagemEnviado: 19 Jun 2015 13:16
por JoséQuintas
Talvez possam postar um exemplo de incluir/alterar uma data usando SQLMIX.

Comando SQL x XBASE

MensagemEnviado: 19 Jun 2015 16:57
por JoséQuintas
Jãnio, sua primeira mensagem ficou sem resposta.

A velocidade do HD é cerca de 3Gb, enquanto a da rede costuma ser 100Mb
Isso dá 30 vezes de diferença, sem contar o cache de disco, que acelera muito mais.
Então uma coisa é o uso de DBF local, e outra coisa é o uso de DBF em rede.

Terminal service é a mesma velocidade de uso local e apesar de muito bom, depende de comprar licença para cada terminal.

Não chegou a comentar se o comparativo foi com DBFs em uso local ou rede.

Comando SQL x XBASE

MensagemEnviado: 22 Jun 2015 16:08
por Itamar M. Lins Jr.
Talvez possam postar um exemplo de incluir/alterar uma data usando SQLMIX.


#require "rddsql"
#require "sddmy"

#include "dbinfo.ch"
#include "error.ch"

REQUEST SDDMY
REQUEST SQLMIX

ANNOUNCE RDDSYS

FIELD RESIDENTS

PROCEDURE Main()
cls
#if defined( __HBSCRIPT__HBSHELL )
   rddRegister( "SQLBASE" )
   rddRegister( "SQLMIX" )
   hb_SDDMY_Register()
#endif

   rddSetDefault( "SQLMIX" )

   ? "RDDs:"; AEval( rddList(), {| x | QQOut( "", x ) } )

   IF rddInfo( RDDI_CONNECT, { "mysql", "localhost", "root","mysql", "test" } ) == 0
      ? "Could not connect to server", rddInfo( RDDI_ERRORNO ), rddInfo( RDDI_ERROR )
      RETURN
   ENDIF

   CreateTable()

   ? "Let's browse table (press any key)"
   Inkey( 0 )
   dbUseArea( .T., , "SELECT * FROM country", "country" )
   Browse()

   ? "Let's browse table ordered by resident count (press any key)"
   Inkey( 0 )
   INDEX ON field->RESIDENTS TAG residents TO country
   Browse()

   dbCloseAll()

   RETURN

STATIC PROCEDURE CreateTable()
LOCAL xData := SET( _SET_DATEFORMAT, "yyyy-mm-dd" )
? xDT := hb_tstostr(hb_datetime())
   ? rddInfo( RDDI_EXECUTE, "DROP TABLE country" )
   ? rddInfo( RDDI_EXECUTE, "CREATE TABLE country (CODE char(3), NAME char(50), RESIDENTS int(11), NASCIDO datetime )" )
   ? rddInfo( RDDI_EXECUTE, "INSERT INTO country values ('LTU', 'Lithuania', 3369600, '"+xDT+"'), ('USA', 'United States of America', 305397000, '2015-06-22'), ('POR', 'Portugal', 10617600, '2015-06-22'), ('POL', 'Poland', 38115967, '2015-06-22'), ('AUS', 'Australia', 21446187, '2015-06-22'), ('FRA', 'France', 64473140, '2015-06-22'), ('RUS', 'Russia', 141900000,'"+xDT+"')" )

SET( _SET_DATEFORMAT, xData)

RETURN


Criar e incluir, alterar é redundância, com DATETIME para não ter CHORO!

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 22 Jun 2015 16:17
por JoséQuintas
Não foi isso que eu quis dizer, mas não me expliquei direito.
Seria usando variáveis, e não dados fixos.
Apenas comentário: Neste mesmo tópico você já havia postado um exemplo desse tipo.

De qualquer forma postei um exemplo de SQLMIX em contribuições.
Pode aproveitar e avisar caso eu tenha errado em alguma coisa.

Aqui:
http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=16259#p97576

Comando SQL x XBASE

MensagemEnviado: 22 Jun 2015 17:17
por Itamar M. Lins Jr.
Neste caso, como sempre... Invertendo ou escondendo o jogo.
Eu não falei que ADO é melhor ou pior que coisa alguma.
Eu estou dizendo que prefiro usar SQLMIX.
Porquê ? Bem para demonstrar isso é mais simples ainda...
É impossível vc ou qualquer outro fazer isso com ADO.

dbUseArea( .T., , "SELECT * FROM country", "country" )
BROWSE()


Para fazer isso, é preciso criar alguma coisa, para fazer a mesma coisa que o SQLMIX está fazendo. Quanto a rotina de GRAVAR/ALTERAR é SQL e temos que fazer a formatação dos dados, que é a mesma coisa do ADO e outros acessos nativos. Mas neste caso todas as linguagens fazem algo similar.
Já tem meses nesta discussão inútil... Vc se prendendo na parte de formatação dos dados e eu demonstrando que por mais que vc queira o RecordSet, não é DBF!

Minha pequena rotina de hoje, pra opção de DBF e MySQL.

cFileDbf := "corre" + Right( StrZero( nCont, 4 ), 2 )
    IF .NOT. File( cFileDbf + ".DBF" )
      cnMySql:cSql := "SELECT * FROM CORRENTE WHERE ANOBASE=" + StringSql( StrZero( nCont, 4 ) ) + " AND LOCOD=" + Ltrim( Str( mLocad00Cod ) ) + ;
       " ORDER BY ANOBASE, LOCOD, NEXTRA, DB, DATA"
      cnMySql:Execute()
      cFileDbf := cnMySql:SqlToDbf( .T. )
      cnMySql:Rs:Close()
    ENDIF


Relendo tudo novamente para transformar em DBF, reinventando a roda simplesmente para não da o braço a torcer.
Por mais que vc queira esconder, não tem MOVEFIRST(), MOVENEXT, MOVELAST()..., vc está reescrevendo tudo que o SQLMIX faz transparentemente apenas para provar sua afirmação;
METHOD SQLToDBF() CLASS ADOClass
LOCAL nSelect, cDbfFile, nCont
nSelect := Select()
cDbfFile := MyTempFile( "dbf" )
SELECT 0
dbCreate( cDbfFile, ::oStructure )
USE ( cDbfFile ) ALIAS SqlToDbf
DO WHILE .NOT. ::Rs:Eof()
   RecAppend()
   FOR nCont = 1 TO Len( ::oStructure )
    DO CASE
    CASE ::oStructure[ nCont, 2 ] == "N"
      FieldPut( nCont, ::NumberSql( ::oStructure[ nCont, 1 ] ) )
    CASE ::oStructure[ nCont, 2 ] == "D"
      FieldPut( nCont, ::DateSql( ::oStructure[ nCont, 1 ] ) )
    OTHERWISE
      FieldPut( nCont, ::StringSql( ::oStructure[ nCont, 1 ] ) )
    ENDCASE
   NEXT
   ::Rs:MoveNext()
ENDDO
::Rs:Close()
USE
SELECT ( nSelect )
RETURN cDbfFile


Esses códigos para transformar em DBF, ou simular no RecordSet um DBF...
METHOD MoveFirst() CLASS frmCadastroClass
IF ::cnMySql == NIL
   GOTO TOP
ELSE
   ::cnMySql:cSql := "SELECT " + ::cMySqlField + " FROM " + ::cMySqlTable + " ORDER BY " + ::cMySqlField + " LIMIT 1"
   ::cn:Execute()
   IF .NOT. ::cn:Eof()
    ::axKeyValue[ 1 ] := ::cn:StringSql( ::cMySqlField )
   ENDIF
   ::cn:rs:Close()
ENDIF
RETURN NIL


Vai rodar, rodar e acabar fazendo um SQLMIX a lá Quintas!!! e depois ir dizendo que é tudo igual.

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 22 Jun 2015 18:32
por JoséQuintas
Itamar:

Pare de ficar poluindo tópicos com copiar/colar.

Já criei um tutorial completo com tudo que todo mundo precisa saber, não há mais nada a acrescentar ou retirar.

O fato de você fugir do exemplo é que está esquisito.
Prefere postar centenas de textos, do que mostrar um exemplo.

Quero que mostre sua inclusão com variáveis numérica, caractere e data.
A partir daí, os exemplos de SQLMIX vão estar completos.
Não é mais simples isso?

Não teremos mais nada a comentar sobre ADO ou SQLMIX, e a poluição acabará.
E as três funções que postei vão se mostrar úteis - dependendo do seu exemplo, é claro.

Comando SQL x XBASE

MensagemEnviado: 22 Jun 2015 18:53
por JoséQuintas
Em todo caso, novamente vou questionar o que você postou.
Explicar direitinho pra você entender.

Estou falando sobre PROGRAMAÇÃO.

Quando usamos uma LIB, apenas usamos e não vemos os fontes.
Parte do que postei passou a fazer parte da minha LIB, então não faz parte do fonte de trabalho.

Apenas questão de PROGRAMAÇÃO, não questão de ser melhor ou pior.

Você pode até estar certo, mas está usando argumentos errados.

Entendeu ou precisa desenhar?

Em todo caso, vamos desenhar....

É como você falar que Linux é melhor porque roda no computador.
Dizendo isso, vou discordar porque o Windows também roda no computador.
E você ficar postando exemplos e mais exemplos, e não concordando que o Windows também roda no computador, e a cada post, mais um argumento errado.

Estou questionando seus argumentos, e não a questão de ser melhor ou pior.

O desenho serviu pra entender?

Reveja seus posts e veja que sempre questiono sobre o que posta, e não sobre melhor ou pior.

Tem essa questão também, pra deixar tudo resolvido.

Só não postar besteira, que não questiono.
Mas ficar poluindo post é que não dá.

Qualquer coisa, abrimos um tópico no bate papo, e vamos resolvendo uma questão de cada vez, até acabar com essa história e com a poluição.

Comando SQL x XBASE

MensagemEnviado: 23 Jun 2015 12:41
por Itamar M. Lins Jr.
Ué ???? Mas esses códigos são seus!
Vc que disse/escreveu isso...
Disse que ADO e SQLMIX são iguais... Agora não é mais ?
Tá bom...

Tudo que coloquei sobre SQLMIX vc posta dizendo que ADO faz isso ou aquilo...
Tem vários posts que vc abriu sobe SQLMIX mas não explica nada só faz falar mal do SQLMIX ou dizer que é tudo igual.
E agora eu é que não explico... Veja, quem começou a história toda não foi eu não sobre SQLMIX x ADO, eu não me preocupo com isso...
Porque sabemos que temos que atender a gregos e troianos.
Quem está perguntado como SQLMIX funciona é vc ou sou eu ? Agora veja se eu te perguntei como ADO funciona ?
Quem está questionando os exemplos que tem sobre SQLMIX, dizendo que estão incompletos... ?
SQLMIX, RDDADO e ADOxb são bibliotecas intermediárias, que ficam entre o ADO e o programa.
Elas usam o ADO do jeito errado, igual DBF, deixando tudo mais lento.

Vc que escreveu isso ai em cima não fui eu não viu...
Nem isso aqui...
Veja, não sou eu que estou dizendo, é o seu roteiro, que até omite algumas partes:

Precisa instalar programa pra baixar do github
Precisa baixar os fontes do Harbour
precisa baixar compilador C
precisa baixar e instalar o servidor MySQL na máquina antes de gerar o Harbour
precisa configurar harbour, compilador c, pra gerar o Harbour


Quando sabemos que só precisamos dos fontes do Harbour e do Mysql ? quem está bagunçando o post sou eu ?
Quem está falando mal do que estou postando sobre SQLMIX sou eu ?
A mesma coisa quando postei da HBIDE que vc não concorda e dai ? Porque ela trava quando vc usa, e não dá os mesmos problemas com os outros...Vc é o dono da verdade ? Quer comparar um IDE obsoleta para códigos em VB... com a HBIDE que é a IDE padrão para o Harbour pelo menos se propõe ser. faz uma bagunça e depois quer mudar tudo e dizer que sou eu... Tá bom então.

Olhe como são suas palavras
Já criei um tutorial completo com tudo que todo mundo precisa saber, não há mais nada a acrescentar ou retirar.


Poxa!!! ai, ai,ai... coitado desse simples mortal que vos escreve!

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 23 Jun 2015 13:53
por JoséQuintas
Não tem jeito, até VB e HBIDE entraram no post agora. Gosta de poluir mesmo.

Tá mesmo fugindo do exemplo de inclusão com variável, não sei porque.

Só lembrando: se existe algum problema no tutorial, poste lá pra que o "desenvolvedor" faça a correção, e não aqui.

Comando SQL x XBASE

MensagemEnviado: 23 Jun 2015 14:12
por Itamar M. Lins Jr.
Vc pediu!
incluir/alterar uma data usando SQLMIX.

? xDT := hb_tstostr(hb_datetime())

xDT é uma variável ou não é Lombardi... ?
? rddinfo( RDDI_EXECUTE, "CREATE TABLE country ...  NASCIDO datetime)")
? rddInfo( RDDI_EXECUTE, "INSERT INTO country values ('LTU', 'Lithuania', 3369600, '"+xDT+"'), ...

O INSERT está usando uma variável ou não está usando Lombardi... ?
Para alterar é só usar UPDATE com xDT... é ou não é Silvio...?

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 23 Jun 2015 14:44
por JoséQuintas
Aleluia.

Pois é, deixou a conversão fora do comando, mas mostrou que precisa converter e colocar entre aspas no comando.

Isso apenas mostra que uma função de conversão pode facilitar, independente do que esteja usando.
Era esse meu questionamento e nada mais, quando mencionou as funções em post anterior.

Mas finalmente postou, obrigado

Nota:
Que eu saiba, não se pode gravar data zerada no MySQL, igual se fazia em versões anteriores.
Mesmo habilitando na configuração (Strict Mode), ele até deixa gravar, mas depois dá erro em consulta.
Nesse caso é onde uso o NULL, como pode ver na função.
Por acaso criaram alguma opção adicional pra isso? Ou isso é particularidade do campo Date, e não do DateTime?
Seria um motivo a mais pra usar uma função de conversão.

Comando SQL x XBASE

MensagemEnviado: 24 Jun 2015 18:59
por Itamar M. Lins Jr.
Mas finalmente postou, obrigado

É porque vc não se dá ao trabalho de ler...
É a segunda vez que coloco esse código. Mais acima tem ele.

Que eu saiba, não se pode gravar data zerada no MySQL, igual se fazia em versões anteriores.
Mesmo habilitando na configuração (Strict Mode), ele até deixa gravar, mas depois dá erro em consulta.


Como mostrado em outro tópico, é algum erro seu ou do ADO, pois o MySQL aceita a DATA com '0000-00-00'
Strict Mode é para gerar erro. Com ele NÃO ativado se o usuário colocar uma data ERRADA irá gravar '0000-00-00'! Ok! Se vai gravar a data 0000-00-00 como é que não aceita ?

Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 24 Jul 2015 13:58
por jairfab
Eu tenho um sistema que utiliza banco de dados dbf e gostaria de passar para sqlmix, quais são as lib necessária para acessar sqlmix.

Eu quero compilar em xharbour.

Comando SQL x XBASE

MensagemEnviado: 24 Jul 2015 15:24
por Itamar M. Lins Jr.
Ola!
Eu não aconselho usar no xHarbour.
O xHarbour até tem a SQLMIX mas está sem atualizações.
No caso é testar ai na pasta contribs\rddsql

2012-06-23 20:51 UTC+0700 Andi Jahja <xharbour/AT/telkom/net/id>
  * include/hbapistr.h
  * source/vm/strapi.c
    + function hb_arrayGetStrUTF8() borrowed from Harbour
    + function hb_strget() borrowed from HWGui

  * include/hbdefs.h
    + HB_SIZEOFARRAY() macro borrowed from Harbour

  * source/vm/fm.c
    ! do not use external memory manager if HB_FM_STATISTICS is defined

  * include/hbapirdd.h
  * source/rdd/workarea.c
    + added new C function hb_rddInheritEx() which allows to retrieve
      super RDD ID during registration (borrowed from Harbour)

  + contrib/rddsql
  + contrib/rddsql/tests
  + contrib/rddsql/hbrddsql.ch
  + contrib/rddsql/hbrddsql.h
  + contrib/rddsql/readme.txt
  + contrib/rddsql/sqlbase.c
  + contrib/rddsql/sqlmix.c
  + contrib/rddsql/tests.arrayrdd.prg
    ! SQL Database Driver borrowed from Harbour


Saudações,
Itamar M. Lins Jr.

Comando SQL x XBASE

MensagemEnviado: 28 Fev 2016 20:33
por sergio.kondo
jairfab escreveu:Eu tenho um sistema que utiliza banco de dados dbf e gostaria de passar para sqlmix, quais são as lib necessária para acessar sqlmix.

Eu quero compilar em xharbour.


Olá Jair, tudo bem?

Conseguiu usar o SQLMix no xHarbour? Estou usando o xHarbour v1.2.1 rev. 6688 e gostaria de usar nesta versão. Será que funciona?

Sérgio

Comando SQL x XBASE

MensagemEnviado: 28 Fev 2016 20:54
por jairfab
Tudo bem serginho!

Eu acho que dar para usar sim, o código fonte do sqlmix é C, portanto não deve ter problemas.

Eu parei com a pesquisa por que precisei iniciar um serviço grande em fivewin, pretendo retornar.

Um grande abraço.