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