SQLRDD - Dificuldade em entender.

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

SQLRDD - Dificuldade em entender.

Mensagem por fladimir »

Senhores, boa noite/bom dia qto mais estou estudando esta ferramenta estou tendo mais dificuldades e após ler o CHM, pesquisar na Net, testar os exemplos estou tendo dificuldades q não estou conseguindo sanar, acredito q possa ser mais um paradigma de quem vem de anos de DBF.


Migrei recentemente um sistema para Postgres e por achar um pouco mais complexo resolvi ir de MySQL mesmo para poder por o trem pra rodar....

Através dos IFDEF da vida estou conseguindo levar em paralelo meu sistema em Harbour + DBFCDX e testando ele em xHarbour + SQLRDD + MYSQL.

Meu sistema esta trabalhando, cadastros, etc etc mas em algumas funções menos simples estou tendo dificuldade...

EXEMPLO:

O usuário faz um Orcamento q é armazenado na tabela correspondente Orcamento no banco de dados Loja... ok
Esta tabela Orcamento dentre os vários campos tem um q uso como FLAG chamado "Pendente" se estiver como "S" = Sim esta Pendente ou "N" Não esta.

Digamos q este usuário fez o Orçamento q gerou o número 00001 e tem 5 itens... Ok...
Qdo vou vender e vou puxar dos Orcamentos o sistema pergunta se desejo ver Somente os Pendentes ou Todos.
Nesta função eu fazia um comando para não aparecer varias linhas para um mesmo Numero de Orcamento

Código: Selecionar todos

INDEX ON &cChave TO &ArqTemp WHILE EVAL(cCond) UNIQUE
//-- Pq usando o Unique conseguia 1 linha para cada Número de Orcamento
Mas aki ocorre o problema, percebi e em pesquisas na internet, inclusive em um post de um dos criadores da RDD, confirmei que esse comando acima o SQLRDD não faz um correspondente em SQL por motivos ora explicados...

Enfim, monitorei através das funções de análise como SR_STARTLOG() e SR_StartTrace() e depois de várias tentativas sem sucesso, resolvi, vou alterar para qdo for IFDEF __XHARBOUR__ passar o comando direto em SQL...

Ai fiz assim:

Código: Selecionar todos

cComm  := "SELECT * FROM ORCAMENTO WHERE PENDENTE='S' GROUP BY NRORC ORDER BY CLIENTE, NRORC"
apCode  := SR_SQLParse( cComm )

//-- Como não entendo direito a lógica da coisa, a tabela estava aberta antes e eu fechei para abrir na memoria uma com o mesmo nome
//-- Carregada a partir do resultado da consulta acima.
IF SELECT(cAlias)>0
    dbclosearea(cALIAS)
ENDIF

//-- Aki estou carregando o resultado da Consulta acima numa WorkArea de mesmo nome q estava trabalhando para q as funções subsequentes pudessem continuar executando normalmente.
dbUseArea( .T., "SQLRDD", cComm, cAlias )

//-- Ok até aki vai bem...

//-- Porém daki pra frente o negócio desanda...

//-- Antes tinha essas 2 linhas q acabei comentando pq como já veio tudo pronto acima e não consegui criar um indice com a mesma chave da tabela original para poder dar continuidade a igualdade dos comandos subsequentes.
//nOrdRetorno:=&cAlias->( INDEXORD() )
//&cAlias->( DBSETFILTER( cCond ) )
E apesar de retornar a consulta da maneira q eu quero, não consigo trabalhar depois, porque o SQLRDD permite q eu jogue o resultado em um Array ou Arquivo Fisico Temporário (DBF, sim DBF) ou direto em uma WorkArea.

Se eu estivesse criando meu sistema poderia ir prevendo isso tudo, agora minha dificuldade é eu estava usando algumas Tabelas q estavam abertas na WorkArea e tive a necessidade de fazer um comando SQL, ai fechei a WorkArea q eu estava usando e abri uma com o resultado da Consulta para poder continuar trabalhando e não consigo...

Resumindo eu quero quando necessário como no caso acima usar um comando SQL e ficar ok como eu trabalhava com um DBF, exemplo:

Código: Selecionar todos

 Use Clientes alias Clientes Shared New...
pronto eu sei q tenho uma Workarea chamada Clientes e posso ir trabalhando, inserir, alterar, filtrar, pesquisar, excluir, etc, etc...[/b]


Como conseguir isto com a SQLRDD?

Pois no exemplo acima eu fiz a consulta no banco joguei na Workarea, mas se eu tentar indexar da erro, consigo até manipular tipo Skip, etc, mas e depois se precisar alterar uma informação e eu fizer exemplo Orcamento->VlrUnit := 10,00 não estara salvando na Tabela do banco...

Isso q esta me confundindo, pois se eu NÃO usar os comandos SQL o RDD faz o translate e grava/altera, etc na tabela dentro da tabela dentro do Banco(que é o que eu quero)...

Agora eu fiz a consulta e joguei na Workarea, mas se eu manipular não ira manipular na tabela correspondente, ai como eu vou fazer?

Senhores, estou muito confuso e agradeço a ajuda que puderem colaborar....

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagem por sygecom »

Olá Fladimir,
Quando você usa assim:
dbUseArea( .T., "SQLRDD",'select * from ORCAMENTO', cAlias )
O SQLRDD abre sua tabela ORCAMENTO como uma tabela temporária, tanto é que se você fizer um APPEN BLANK nessa areá esse registro não vai para sua tabela ORCAMENTO e sim apenas para essa areá que está aberta.
Você usar assim:

USE ORCAMENTO ALIAS
SELECT ORCAMENTO
SR_SETFILTER( "PENDENTE='S' " )

Esse SR_SETFILTER() é muito rápido, ele executa comando SQL direto no banco de dados.

Sobre o Mysql cuida com a licença do MYSQL que não é free dependendo de como você usa. Se um dia precisar de ajuda para usar POSTGRESQL post no fórum que vamos se ajudando.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagem por fladimir »

Vlw Leo... vou fazer os testes e depois posto o resultado.

...postando os resultados...

Leo eu fiz o SR_SETFILTER com a Area Corrente funcionou em partes pois na verdade preciso que apareçam somente o nome do cliente, numero do orçamento e valor, no Harbour + DBFCDX eu fazia um INDEX com UNIQUE no final para obter tal resultado.... no SQL teria q fazer no final um GROUP BY NRORC, mas ao jogar isso junto no SR_SETFILTER não da erro mas qdo vai montar o Box e apresentar os resultados eu faço 2 comandos:

Código: Selecionar todos

Alias->(Ordsetfocus(nOrdem))
Alias->(dbgobottom())
Ai da erro na SQLRDD...
Mas se eu faço sem o Group By somente com o Filtro Funciona...., mas preciso q seja GROUP BY X E ORDER BY Y

Não tem como eu executar um Comando SQL na área corrente?

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagem por sygecom »

Olá Cassiano,
Não tem o que você quer.
Pense que agora você tem dois ambiente, um XBASE e outro SQL e pode usar no mesmo programa, mas não no mesmo momento, a não ser que você use primeiro um comando SQL e pegue o resultado dele em DBF(temporario) e use como um XBASE, mas sem os indice do DBF original que gerou o resultado.
Você pode executar um comando SQL que já retorne exatamente como você quer em um DBF novo(temporário) ou em um vetor. Ou você usa como XBASE usando o SR_SETFILTER() para filtrar apenas o que você quer, logo após um SR_SETFILTER() tens que dar um DBGOTOP() igual era para ORDSCOPE() .
Eu deixaria de usar o UNIQUE no INDEX e passaria a usar um comano só em SQL nesse caso, isso eu hoje.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

SQLRDD - DIFICULDADE EM ENTENDER. Resolvido

Mensagem por fladimir »

Leonardo deu certo eu fiz da seguinte forma, com a ajuda do Fernando Casagrande e a tua...

É dentro do q vc disse mesmo...

Segue abaixo...

Código: Selecionar todos

... Parte do código q contem a alteração
    IF lUnique
		 #IFDEF __XHARBOUR__
		  ARQTEMP()
		 &cAlias->(dbclosearea())
		 IF UPPER(cAlias) == 'COT'
		 	 cAlias := 'COTACAO'
		    Endif
			 cQuery := "SELECT * FROM " + cAlias + " WHERE " + cCond
			 oSql := SR_GetConnection()
		    oSql:exec(cQuery,,.T.,,(arq_temp9),"COT")
			 INDEX ON COT->PEDIDO + COT->CLIENTE TAG ordId02 ADDITIVE TEMPORARY
		 #ELSE
		    INDEX ON &cChave TO &arq_temp2 WHILE EVAL(cCond) UNIQUE
    	    #endif
	 ELSE
               INDEX ON &cChave TO &arq_temp2 WHILE EVAL(cCond)
    ENDIF

... restante do código
Vlw colegas

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
pauloa1
Usuário Nível 3
Usuário Nível 3
Mensagens: 227
Registrado em: 25 Jun 2008 14:57
Localização: Augusto Pestana-RS

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagem por pauloa1 »

Olá Leonardo!

O SR_SETFILTER é mais rápido do que usar set filter to ?

Paulo
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagem por sygecom »

Bem mais rápido...
Só cuida que usa comandos SQL
Ex usando SR_SETFILER():
cBUSCA:='LEONARDO'
SELECT AGENDA
SR_SETFILTER('NOME=' + sr_cdbvalue(cBUSCA) + " and IDADE > 18")

Ex usando SET FILER TO:
cBUSCA:='LEONARDO'
SELECT AGENDA
SET FILTER TO AGENDA->NOME=cBUSCA .and. AGENDA->IDADE > 18
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
abassanezi
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 26 Ago 2004 09:47
Localização: Osasco/SP

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagem por abassanezi »

Fladimir,

Você precisa procurar por soluções por comandos SQL, dificilmente você vai encontrar na internet informações para solução disto com o SQLRDD.

Por exemplo para você resolver o UNIQUE procure pelo comando DISTINCT, vai ter o resultado semelhante ao que você tinha no índice, mas não é necessário indice pra isto.

Exemplo na tabela de itens do orçamento tenho:

Orçamento Produto
000001 010
000001 011
000002 001
000003 010

com SELECT DISTINCT ORCAMENTO FROM MOV_ORC ORDER BY ORCAMENTO terá o seguinte retorno:

Orçamento
000001
000002
000003

com SELECT DISTINCT PRODUTO FORM MOV_ORC ORDER BY PRODUTO terá o seguinte retorno:

Produto
001
010
011

Abs,


Alexandre
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

SQLRDD - Dificuldade em entender.

Mensagem por fladimir »

Obrigado Alexandre por mais esta colaboração...

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Responder