Clipper On Line • Ver Tópico - SQLRDD - Dificuldade em entender.

SQLRDD - Dificuldade em entender.

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

SQLRDD - Dificuldade em entender.

Mensagempor fladimir » 12 Mai 2012 05:35

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

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:
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:
 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...


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 de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2434
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 157 vezes

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagempor sygecom » 13 Mai 2012 14:59

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
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7006
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 130 vezes

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagempor fladimir » 13 Mai 2012 21:05

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:

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 de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2434
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 157 vezes

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagempor sygecom » 16 Mai 2012 14:13

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
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7006
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 130 vezes

SQLRDD - DIFICULDADE EM ENTENDER. Resolvido

Mensagempor fladimir » 16 Mai 2012 17:05

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...

... 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.
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2434
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 157 vezes

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagempor pauloa1 » 15 Jun 2012 16:08

Olá Leonardo!

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

Paulo
pauloa1
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 223
Data de registro: 25 Jun 2008 14:57
Cidade/Estado: Augusto Pestana-RS
Curtiu: 2 vezes
Mens.Curtidas: 11 vezes

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagempor sygecom » 15 Jun 2012 16:25

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
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7006
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 130 vezes

SQLRDD - DIFICULDADE EM ENTENDER.

Mensagempor abassanezi » 27 Jun 2012 21:00

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
abassanezi
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 1
Data de registro: 26 Ago 2004 09:47
Cidade/Estado: Osasco/SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

SQLRDD - Dificuldade em entender.

Mensagempor fladimir » 27 Jun 2012 21:45

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.
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2434
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 157 vezes




Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 12 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
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