Página 1 de 2

dbusearea() X copy to

Enviado: 05 Jul 2014 13:19
por cjp
Meus amigos,

Estou começando a usar MySQL e, por isso, estou tendo que mudar muita coisa em meu programa.

Numa dessas mudanças, estou passando a usar a função Dbusearea(), em lugar do comando Use que eu usava até agora.

O problema é que, com a Dbusearea(), não estou conseguir usar o comando copy to. Não sei porque, não funciona.

Estou tentando assim:

Código: Selecionar todos

         DBUSEAREA( .T.,, "SELECT * FROM tarefas WHERE usuario='"+us+"'", "consedit")
         copy fields dtincl,prioridade,arquivo,assunto,tarefa,soluc,exibe,data,hora to temp1 for soluc#"S" .and.;
            prioridade>0 .and. ((substr(arquivo,1,1)=us .and. exibe="S") .or. (us="U" .and. exibe="M"));
            .and. (data<date() .or. (data=date() .and. val(substr(hora,1,2))<val(substr(time(),1,2))) .or. (data=date() .and.;
            val(substr(hora,1,2))=val(substr(time(),1,2)) .and. val(substr(hora,4,2))<val(substr(time(),4,2))))

Se realmente não funciona o copy to com a dbusearea(), tem alguma alternativa?

Me falaram que dá pra usar use ( "SELECT * FROM tarefas WHERE usuario='"+us+"'" ) new via "SQLRDD" alias consedit no xHarbour, mas eu troquei o xHarbour por Harbour faz algum tempo, em razão da necessidade de algumas libs, não gostaria de voltar ao xHarbour.

dbusearea() X copy to

Enviado: 05 Jul 2014 15:53
por fladimir
Colega, se entendi bem vc esta usando SQLRDD correto, se for isto até onde sei não tem SQLRDD para Harbour infelizmente.

Se vc não pretende voltar para o xHarbour terá q mudar o SQLRDD caso a informação acima esteja correta (algum outro colega poderia confirmar).

Se realmente precisar mudar de SQLRDD para outro tem a libmysql da Contrib q te permite acessar Bancos MySQL no Harbour (no xHarbour acredito q tb funcione não testei).

[]´s

dbusearea() X copy to

Enviado: 05 Jul 2014 16:47
por cjp
Não, eu uso a SLQMIX, no Harbour.

A SQLRDD foi sugestão de quem me informou que daria pra fazer no xHarbour.

Não entendi bem o que vc falou sobre libmysql, e não achei nada com esse nome na pasta Contrib.

dbusearea() X copy to

Enviado: 05 Jul 2014 17:55
por Toledo
cjp escreveu:O problema é que, com a Dbusearea(), não estou conseguir usar o comando copy to. Não sei porque, não funciona.
Não sei dizer se o comando COPY TO está preparado para ser usado com uma base MySQL, mas dependendo do que você vai fazer, pode usar o SELECT do MySQL para escolher o campos e também fazer o filtro.
cjp escreveu:Me falaram que dá pra usar use ( "SELECT * FROM tarefas WHERE usuario='"+us+"'" ) new via "SQLRDD" alias consedit no xHarbour
Bom, a linha onde você está usando o comando DbUseArea() no seu código é praticamente a mesma coisa.

No seu código você está usando SELECT * FROM..., então será selecionado todos os campos da tabela, mas se desejar, você pode escolher os campos que serão apresentados, no lugar do * coloque os nomes dos campos (mais de um separar com vírgula). E no WHERE você pode fazer o seu filtro, mas já confesso que fiquei com um nó na cabeça só de tentar entender este filtro que está no seu código. Então acho melhor você fazer um filtro mais simples para ver como o SELECT funciona e depois com mais calma colocar este seu filtro.

Abraços,

dbusearea() X copy to

Enviado: 05 Jul 2014 19:04
por fladimir
Desculpe não é libmysql da contrib e sim HBMYSQL e precisa da libmysql.dll

[]´s

dbusearea() X copy to

Enviado: 06 Jul 2014 01:38
por cjp
De fato, funcionou. Obrigado.

Realmente o filtro está bem complicado, mas eu me entendo com ele.

O único problema é que eu preciso de uma cláusula UNIQUE, ou equivalente, no filtro. Pesquisando, verifiquei que a SELECT tem a DISTINCT, mas aparentemente ela não está funcionando.

Testei:

Código: Selecionar todos

         DBUSEAREA( .T.,, "SELECT distinct nrtarefa,data,prioridade,assunto FROM tarefas WHERE usuario='"+us+"'", "consedit")
E também:

Código: Selecionar todos

         DBUSEAREA( .T.,, "SELECT distinct(nrtarefa),data,prioridade,assunto FROM tarefas WHERE usuario='"+us+"'", "consedit")
Mas nenhuma das duas funcionaram.

Eu precisaria de um jeito de exibir apenas a primeira ocorrência de cada nrtarefa. Como faço?

dbusearea() X copy to

Enviado: 06 Jul 2014 10:02
por fladimir
Experimente:

Código: Selecionar todos

DBUSEAREA( .T.,, "SELECT distinct(nrtarefa),data,prioridade,assunto FROM tarefas WHERE usuario='"+us+"'  LIMIT 0,1", "consedit")

dbusearea() X copy to

Enviado: 06 Jul 2014 11:14
por Toledo
cjp escreveu:erifiquei que a SELECT tem a DISTINCT, mas aparentemente ela não está funcionando.
Para apresentar vários campos o DISTINCT não vai dar certo.
cjp escreveu:Eu precisaria de um jeito de exibir apenas a primeira ocorrência de cada nrtarefa. Como faço?
Neste caso, tente usar GROUP BY:

Código: Selecionar todos

DBUSEAREA( .T.,, "SELECT nrtarefa,data,prioridade,assunto FROM tarefas WHERE usuario='"+us+"' GROUP BY nrtarefa", "consedit")
Abraços,

dbusearea() X copy to

Enviado: 31 Jul 2014 02:50
por cjp
Funcionou, Toledo. Obrigado.

Mas, para uma outra situação, novamente eu preciso substituir o copy to, e não sei como fazer isso.

Estou querendo salvar uma parte de uma tabela do banco de dados do provedor em um arquivo físico (pode ser um .dbf) no disco local. Fiz o select, mas não sei como transformar o resultado num .dbf sem o copy to.

Pensei até em copiar item por item, pegando da tabela do banco de dados com uma variável e salvando no dbf um a um, mas achei esta solução muito rústica. Deve haver um jeito melhor de fazer isso, não?

dbusearea() X copy to

Enviado: 31 Jul 2014 07:42
por Toledo
cjp escreveu: Deve haver um jeito melhor de fazer isso, não?
Acho que infelizmente NÃO, você terá que copiar um a um mesmo para um DBF.

Abraços,

dbusearea() X copy to

Enviado: 31 Jul 2014 13:40
por JoséQuintas
Costumo usar ADO direto, mas tem também a ADORDD.
Com ADORDD, só selecionar a RDD no copy.
Com ADO, teria que fazer um a um.

Mas tem que lembrar que existem campos no MySql que não podem ser tratados diretamente no programa ou no DBF.
O principal e mais chato é o campo sem conteúdo.

dbusearea() X copy to

Enviado: 31 Jul 2014 14:45
por rochinha
Amiguinhos,

Ja tentaram usar o COPY TO ... VIA "DBFNTX"?
Pensei até em copiar item por item, pegando da tabela do banco de dados com uma variável e salvando no dbf um a um, mas achei esta solução muito rústica. Deve haver um jeito melhor de fazer isso, não?
A solução é o feijão-com-arroz, pois se você copia registros de outra base lançando em outra de outro formato, você pode manipular os dados da sua forma. Inclusive porque alguns resultados retornados de bases SQL precisam de tratamento antes de colocar num .DBF que não aceita campos acentuados ou caracteres estranhos no conteúdo de campos.

dbusearea() X copy to

Enviado: 02 Ago 2014 00:27
por cjp
O copy to funcionou, desta forma:

Código: Selecionar todos

function salvatsql
         if conexsql()
		    DBUSEAREA( .T.,, "SELECT data,hora,acao,nrtarefa,assunto,detalhes,prioridade,tempousado,tempocompu,campo,usuario,programa FROM ativ where data='"+alltrim(str(year(date())))+"-"+substr(dtoc(date()),4,2)+"-"+substr(dtoc(date()),1,2)+"'", "atdia")
         endif
         RDDSETDEFAULT("DBFNTX")
		 copy to at0208
		 use
return
Acho que faltava apenas o RDDSETDEFAULT("DBFNTX") antes do copy to.

Muito obrigado a todos.

dbusearea() X copy to

Enviado: 19 Out 2014 11:22
por cjp
Meus amigos,

Mais uma vez vou precisar da ajuda de vocês para esta questão do copy to.

Tenho uma outra função em que preciso copiar parte de uma tabela de um banco de dados MySQL para um .dbf. Estou fazendo de forma semelhante à função anterior. Vejam:

Código: Selecionar todos

function ftecenter
                 local vzab :=0
		 local cores :=setcolor()
		 local arqsp :=arq
		 private pr, as, ex, sol, te
		 keysec(277,200,-1,.t.)
		 if "."$arqsp
		    arqsp=substr(arqsp,1,at(".",arqsp)-1)
		 endif
		 if "URGSQL"$procname(1) .or. "URGSQL"$procname(2) .or. "URGSQL"$procname(3) .or. "URGSQL"$procname(4)
		    if conexsql()
                       DBUSEAREA( .T.,, "SELECT prioridade,assunto,tarefa,exibe,soluc FROM tarefas WHERE nrtarefa='"+arq+"' OR nrtarefa='"+arqsp+"'", "arqsp2")
                       RDDSETDEFAULT("DBFNTX")
		       copy to (arqsp) //for (nrtarefa=arq .or. nrtarefa=arqsp)
	           endif
             endif
Não dá erro, mas não copia para a base.

Já testei de várias formas, mas nada funciona.

Alguém me ajuda?

dbusearea() X copy to

Enviado: 19 Out 2014 18:54
por Itamar M. Lins Jr.
Não precisa mudar o Driver
RDDSETDEFAULT... não é necessário.
Use:
copy to (aResult) via "DBFNTX"
Saudações,
Itamar M. Lins Jr.