dbusearea() X copy to

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dbusearea() X copy to

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

dbusearea() X copy to

Mensagem 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
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.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dbusearea() X copy to

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

dbusearea() X copy to

Mensagem 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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

dbusearea() X copy to

Mensagem por fladimir »

Desculpe não é libmysql da contrib e sim HBMYSQL e precisa da libmysql.dll

[]´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.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dbusearea() X copy to

Mensagem 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?
Inacio de Carvalho Neto
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

dbusearea() X copy to

Mensagem por fladimir »

Experimente:

Código: Selecionar todos

DBUSEAREA( .T.,, "SELECT distinct(nrtarefa),data,prioridade,assunto FROM tarefas WHERE usuario='"+us+"'  LIMIT 0,1", "consedit")
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
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

dbusearea() X copy to

Mensagem 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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dbusearea() X copy to

Mensagem 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?
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

dbusearea() X copy to

Mensagem 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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

dbusearea() X copy to

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

dbusearea() X copy to

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dbusearea() X copy to

Mensagem 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.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dbusearea() X copy to

Mensagem 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?
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

dbusearea() X copy to

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Responder