Substituição condicional em arquivo .dbf
Moderador: Moderadores
Substituição condicional em arquivo .dbf
Olá. Eu não sou programador, mas por força do meu trabalho eu tenho de lidar com esses veneráveis velhinhos Clipper e dBase... Meu problema é simples, eu tenho certeza que vocês veteranos vão saber como fazer mas eu não tenho a menor idéia.
Eu tenho um arquivo com o estoque de mais de mil itens no formato .dbf CDX com várias colunas de dados. E eu preciso fazer a troca da tributação de alguns tipos de produtos, de 000 para 060.
Por exemplo, o campo TRIBUTAÇÃO de todos os itens com o campo TIPO_DE_PRODUTO = FILTROS de 000 para 060. Todas as CORREIAS de 000 para 060 e assim por diante...
É ridiculamente simples, mas eu nem imagino como. Eu já tentei o DBU, mas ele parece não fazer isso. O CLUT tem a função Replace, mas eu não consegui fazer funcionar, ele sempre dá mensagens de erro. "Syntax error", etc. pra ser mais exato.
O Microsoft Access eu tenho certeza que deve fazer, mas também não sei como. Ele sempre dá mensagens de 'arquivo bloqueado' e coisas assim. O sistema criado criado especialmente pra acessar esse banco de dados não chega nem perto de executar uma tarefa "tão complexa" dessas.
Por isso que estou aqui pedindo socorro aos experts do negócio, de como fazer essa substituição condicional usando algum desses programas que eu já possuo ou algum outro qualquer. Qualquer ajuda será muito bem-vinda e já agradeço antecipadamente.
Eu tenho um arquivo com o estoque de mais de mil itens no formato .dbf CDX com várias colunas de dados. E eu preciso fazer a troca da tributação de alguns tipos de produtos, de 000 para 060.
Por exemplo, o campo TRIBUTAÇÃO de todos os itens com o campo TIPO_DE_PRODUTO = FILTROS de 000 para 060. Todas as CORREIAS de 000 para 060 e assim por diante...
É ridiculamente simples, mas eu nem imagino como. Eu já tentei o DBU, mas ele parece não fazer isso. O CLUT tem a função Replace, mas eu não consegui fazer funcionar, ele sempre dá mensagens de erro. "Syntax error", etc. pra ser mais exato.
O Microsoft Access eu tenho certeza que deve fazer, mas também não sei como. Ele sempre dá mensagens de 'arquivo bloqueado' e coisas assim. O sistema criado criado especialmente pra acessar esse banco de dados não chega nem perto de executar uma tarefa "tão complexa" dessas.
Por isso que estou aqui pedindo socorro aos experts do negócio, de como fazer essa substituição condicional usando algum desses programas que eu já possuo ou algum outro qualquer. Qualquer ajuda será muito bem-vinda e já agradeço antecipadamente.
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Re: Substituição condicional em arquivo .dbf
Gianop, estou anexando junto a esta mensagem uma versão do DBU para DBFCDX que acho que vai lhe ajudar.
Execute este DBU e siga as seguintes orientações:
1 - Pressione F2/Database e selecione o seu DBF.
2 - Pressione F6/Replace e escolha o campo que terá o seu valor alterado...
3 - No campo WITH informe o novo valor do campo.
4 - No campo FOR informe a condição (Filtro).
5 - Depois escolha OK.
Obs.: na condição (filtro) você vai ter que informar o TIPO_DE_PRODUTO e o bloco de códigos que serão alterados, por exemplo:
ALLTRIM(TIPO_DE_PRODUTO)="CORREIAS".AND.CODIGO>="000".AND.CODIGO<="060"
Atenção: por segurança, faça uma cópia do seu DBF.
Abraços,
Execute este DBU e siga as seguintes orientações:
1 - Pressione F2/Database e selecione o seu DBF.
2 - Pressione F6/Replace e escolha o campo que terá o seu valor alterado...
3 - No campo WITH informe o novo valor do campo.
4 - No campo FOR informe a condição (Filtro).
5 - Depois escolha OK.
Obs.: na condição (filtro) você vai ter que informar o TIPO_DE_PRODUTO e o bloco de códigos que serão alterados, por exemplo:
ALLTRIM(TIPO_DE_PRODUTO)="CORREIAS".AND.CODIGO>="000".AND.CODIGO<="060"
Atenção: por segurança, faça uma cópia do seu DBF.
Abraços,
- Anexos
-
DBUCDX.ZIP- DBU para arquivos padrão DBFCDX
- (233.31 KiB) Baixado 345 vezes
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
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
Re: Substituição condicional em arquivo .dbf
Oi. Pra começar eu tenho que fazer uma correção: aquele sistema que eu trabalho produz arquivos .dbf no formato NTX e não no CDX, como eu tinha dito no início. Não sei qual é a diferença entre os vários formatos de .dbf, mas deve ser relevante.
Eu já tinha tentado fazer essa substituição no DBU e no CLUT, exatamente como tu disse. Mas no DBU o resultado é a mensagem de erro: "Type mismatch between replace expression and field." E no CLUT a mensagem é: "Expression type is inconsistent with field type. Expression type = 'N' - Field type = 'C'".
Mais um esclarecimento: os campos que representam os TIPOS_DE_PRODUTOS são numéricos, isto é, não são palavras que tão no .dbf, mas números. Por ex.: CORREIAS são 000025, FILTROS são 000030... Também não sei se isso faz diferença, mas as mensagens "mismatch expression" e "inconsistent type" me sugeriram que eu devia deixar isso bem claro.
Eu já tinha tentado fazer essa substituição no DBU e no CLUT, exatamente como tu disse. Mas no DBU o resultado é a mensagem de erro: "Type mismatch between replace expression and field." E no CLUT a mensagem é: "Expression type is inconsistent with field type. Expression type = 'N' - Field type = 'C'".
Mais um esclarecimento: os campos que representam os TIPOS_DE_PRODUTOS são numéricos, isto é, não são palavras que tão no .dbf, mas números. Por ex.: CORREIAS são 000025, FILTROS são 000030... Também não sei se isso faz diferença, mas as mensagens "mismatch expression" e "inconsistent type" me sugeriram que eu devia deixar isso bem claro.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Re: Substituição condicional em arquivo .dbf
Oi Gian, bem vindo ao fórum. Pelo visto você acostuma trabalhar na madrugada (pelo horário das postagens das suas mensagens). Vamos por partes (disse Jack o estripador...)
1. Deu certo as alterações no seu DBF com o aplicativo apresentado pelo Sr. Toledo ?
2. Quando você fala do seu banco de dados, normalmente em Clipper a extensão do arquivo é DBF. Não confundamos com .CDX nem .NSX, estes são arquivos de índices. Se quiser, aqui http://pt.wikipedia.org/wiki/Lista_Alfa ... de_arquivo você pode ver através da extensão obter a finalidade de cada arquivo.
4. Um arquivo de índice é criadp através do comando INDEX TO e serve para localização e ordenação em ordem alfabética, numerica e de data. Isso dependerá da necessidade do seu sistema.
5. Pelo que estou entendendo você tentou usar o DBU mas não obteve sucesso porque deu mismatch error. Você que está começando, deveria guiar-se da documentação que o Clipper tem. Que são arquivos .NG este deve estar numa pasta (que acostuma ser NG) e acessar o Norton Guide NG.EXE, seja para ver a sintaxe, como exemplos de utilização dos comandos e funções e para entender as mensagens de erro. Você precisa tratar cada campo conforme o seu TIPO (caracter, numerico, data, lógico ou memo).
6. Para que possamos auxilia-lo passo a passo, é necessário que você liste para nós a estrutura do seu DBF em questão e cole aqui neste tópico, para que saibamos como tratar o replace e sua condição. Veja este tópico, irá ser útil para isso viewtopic.php?f=13&t=6616#p33612
7. Se quiser que abordemos o que deve ter ocorrido na tentativa dos REPLICEs, coloque aqui como foi que você fez.
8. Após tenhamos feito alteração do seu BD, devemos atualizar seus arquivos de índices, recompondo-os com REINDEX ou INDEX TO...
1. Deu certo as alterações no seu DBF com o aplicativo apresentado pelo Sr. Toledo ?
2. Quando você fala do seu banco de dados, normalmente em Clipper a extensão do arquivo é DBF. Não confundamos com .CDX nem .NSX, estes são arquivos de índices. Se quiser, aqui http://pt.wikipedia.org/wiki/Lista_Alfa ... de_arquivo você pode ver através da extensão obter a finalidade de cada arquivo.
3. Portanto você NÃO deve mudar a extensão-de-arquivo do seu banco de dados, apesar que isso seria possível, você iria se perder e o sistema não funcionar adequadamente quando for utilizado com a mesma extensão-nomenclatura de um arquivo índice.GianOp escreveu:Oi. Pra começar eu tenho que fazer uma correção: aquele sistema que eu trabalho produz arquivos .dbf no formato NTX e não no CDX
4. Um arquivo de índice é criadp através do comando INDEX TO e serve para localização e ordenação em ordem alfabética, numerica e de data. Isso dependerá da necessidade do seu sistema.
5. Pelo que estou entendendo você tentou usar o DBU mas não obteve sucesso porque deu mismatch error. Você que está começando, deveria guiar-se da documentação que o Clipper tem. Que são arquivos .NG este deve estar numa pasta (que acostuma ser NG) e acessar o Norton Guide NG.EXE, seja para ver a sintaxe, como exemplos de utilização dos comandos e funções e para entender as mensagens de erro. Você precisa tratar cada campo conforme o seu TIPO (caracter, numerico, data, lógico ou memo).
6. Para que possamos auxilia-lo passo a passo, é necessário que você liste para nós a estrutura do seu DBF em questão e cole aqui neste tópico, para que saibamos como tratar o replace e sua condição. Veja este tópico, irá ser útil para isso viewtopic.php?f=13&t=6616#p33612
7. Se quiser que abordemos o que deve ter ocorrido na tentativa dos REPLICEs, coloque aqui como foi que você fez.
8. Após tenhamos feito alteração do seu BD, devemos atualizar seus arquivos de índices, recompondo-os com REINDEX ou INDEX TO...
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Re: Substituição condicional em arquivo .dbf
Oi Pablo, obrigado pelo interesse. Não repare muito no horário das minhas mensagens porquê eu sou meio vampiro mesmo... 
Eu certamente sei muito bem a diferença entre extensão e formato de arquivo. Eu estava falando no formato do índice do arquivo .dbf, porquê existem os índices CDX, MDX, NDX e NTX. Eu achei que o índice dos arquivos .dbf com que eu trabalho estavam no formato NTX, mas o cabeçalho do arquivo em questão diz que ele não tem índice estrutural e qualquer RDD serve. O CLUT escolhe o NTX automaticamente pra abrir, isso me levou a concluir que usasse o NTX, mas aparentemente ele não usa nenhum em especial. Não se preocupe porquê eu obviamente não mudei a extensão do arquivo, isso seria ilógico e inútil. : )
O sistema com que eu trabalho não é exatamente o Clipper, mas um programa que foi criado usando o Clipper. E ele produz arquivos de dados no formato dBase. Tentando fazer a substituição usando o dBase III Plus, depois do ".use Produtos.dbf" a mensagem foi: "Not a dBASE database". Usando o dBase 5 sem restringir a substituição foi "No records were replace". E tentando restringir o escopo, a mensagem foi "Wrong result type, desired result type is logical". No DBU (eu testei nas 3 versões que eu tenho), o resultado foi "FOR must be a logical expression" com ou sem aspas... No CLUT a mensagem em For: foi "Expression is not a logical type!"...
Quando a teu pedido pra listar a estrutura do arquivo .dbf, meus conhecimentos de programação são muitos poucos. Como disse eu não sou programador e acho que não saberia seguir teu método sugerido sem uma ajuda passo a passo. Mas posso sem problemas te deixar disponível um exemplo do arquivo e o cabeçalho dele, obtido com o CLUT:
produtos.zip - 0.05MB

Eu certamente sei muito bem a diferença entre extensão e formato de arquivo. Eu estava falando no formato do índice do arquivo .dbf, porquê existem os índices CDX, MDX, NDX e NTX. Eu achei que o índice dos arquivos .dbf com que eu trabalho estavam no formato NTX, mas o cabeçalho do arquivo em questão diz que ele não tem índice estrutural e qualquer RDD serve. O CLUT escolhe o NTX automaticamente pra abrir, isso me levou a concluir que usasse o NTX, mas aparentemente ele não usa nenhum em especial. Não se preocupe porquê eu obviamente não mudei a extensão do arquivo, isso seria ilógico e inútil. : )
O sistema com que eu trabalho não é exatamente o Clipper, mas um programa que foi criado usando o Clipper. E ele produz arquivos de dados no formato dBase. Tentando fazer a substituição usando o dBase III Plus, depois do ".use Produtos.dbf" a mensagem foi: "Not a dBASE database". Usando o dBase 5 sem restringir a substituição foi "No records were replace". E tentando restringir o escopo, a mensagem foi "Wrong result type, desired result type is logical". No DBU (eu testei nas 3 versões que eu tenho), o resultado foi "FOR must be a logical expression" com ou sem aspas... No CLUT a mensagem em For: foi "Expression is not a logical type!"...
Quando a teu pedido pra listar a estrutura do arquivo .dbf, meus conhecimentos de programação são muitos poucos. Como disse eu não sou programador e acho que não saberia seguir teu método sugerido sem uma ajuda passo a passo. Mas posso sem problemas te deixar disponível um exemplo do arquivo e o cabeçalho dele, obtido com o CLUT:
produtos.zip - 0.05MB

Editado pela última vez por GianOp em 28 Jun 2008 04:56, em um total de 1 vez.
- Luciano Bonfim
- Usuário Nível 3

- Mensagens: 414
- Registrado em: 23 Ago 2007 09:34
- Localização: Rio de Janeiro / São Paulo
- Contato:
Re: Substituição condicional em arquivo .dbf
Amigo,
zipa este DBF e deixa aqui pra gente e explica o que vc quer mudar... assim fica mais fácil
Obrigado
zipa este DBF e deixa aqui pra gente e explica o que vc quer mudar... assim fica mais fácil
Obrigado
Muito Obrigado,
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Re: Substituição condicional em arquivo .dbf
Luciano, no 1º tópico eu explico o quê eu quero fazer: é a substituição do campo TRIBUTACAO no valor 000 por 060 em alguns registros. Mas o mais importante é eu saber o quê eu tô fazendo errado ou como fazer pra dar certo.
Eu corrigi o link pra download do arquivo no tópico anterior. Aqui vai de novo: produtos.zip - 0.05MB
Eu corrigi o link pra download do arquivo no tópico anterior. Aqui vai de novo: produtos.zip - 0.05MB
- Luciano Bonfim
- Usuário Nível 3

- Mensagens: 414
- Registrado em: 23 Ago 2007 09:34
- Localização: Rio de Janeiro / São Paulo
- Contato:
Re: Substituição condicional em arquivo .dbf
que mané DBU que nada, faz assim:
compila e linka esse programa ai e vamu que vamu... assim vc ja começa a usar o clipper, daquei a 1 mes vc já vai estar alterando o seu sistema e tudo
basta mudar a condicao do tip_prod e o valor depois do with para o que vc quer fazer
Código: Selecionar todos
use produtos
go top
do while !eof()
if tipo_prod="000006" .or. tipo_prod="000015"
replace tributacao with "060"
endif
skip
enddo
basta mudar a condicao do tip_prod e o valor depois do with para o que vc quer fazer
Muito Obrigado,
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Re: Substituição condicional em arquivo .dbf
Obrigado a todos pelo interesse e pela ajuda, especialmente ao Sr. Toledo pela explicação e exemplo da sintaxe, facilitou bastante. Era eu que tava errando na digitação, mas agora eu acertei e funcionou beleza.
Ao Luciano Bonfim: como eu disse não sou programador e entendi pouco da tua explicação. Compilar e linkar o programa que tu escreveu onde e como? No Clipper? Eu te adicionei no MSN pra pedir ajuda se eu tentar essa dica, ok?
Agora um último socorro: tem como filtrar vários tipos de registros de uma vez só? Eu tentei: FILTER=(TIPO_PROD)="000007".AND."000036". Não funcionou... Tentei:
FILTER=(TIPO_PROD)="000007".AND.(TIPO_PROD)="000036". Também não funcionou... Só dá pra filtrar um tipo de registro por vez ou qual é a sintaxe?
Ao Luciano Bonfim: como eu disse não sou programador e entendi pouco da tua explicação. Compilar e linkar o programa que tu escreveu onde e como? No Clipper? Eu te adicionei no MSN pra pedir ajuda se eu tentar essa dica, ok?
Agora um último socorro: tem como filtrar vários tipos de registros de uma vez só? Eu tentei: FILTER=(TIPO_PROD)="000007".AND."000036". Não funcionou... Tentei:
FILTER=(TIPO_PROD)="000007".AND.(TIPO_PROD)="000036". Também não funcionou... Só dá pra filtrar um tipo de registro por vez ou qual é a sintaxe?
O comando SET FILTER depende de uma expressão lógica. Ou seja, uma expressão que retorne TRUE ou FALSE. Uma expressão lógica pode ser simples (NRO=="001" - uma comparação simples) ou complexa (NRO=="001" .OR. NRO="002"). A forma complexa nada mais é que uma concatenação de várias expressões simples, que utilizam operadores de comparação, unidas pelos operadores lógicos: .AND. ou .OR. Aliás, uma expressão simples também pode ser representada por uma chamada à uma função qualquer que, claro, deve retornar um valor lógico.
Minha explicação foi bem simplificada. Melhor seria se você consultasse o NG do Clipper e, principalmente, bisbilhotasse os vários códigos exemplos que o acompanham e mesmo os códigos fontes que são instalados na pasta do Clipper.
Minha explicação foi bem simplificada. Melhor seria se você consultasse o NG do Clipper e, principalmente, bisbilhotasse os vários códigos exemplos que o acompanham e mesmo os códigos fontes que são instalados na pasta do Clipper.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- Luciano Bonfim
- Usuário Nível 3

- Mensagens: 414
- Registrado em: 23 Ago 2007 09:34
- Localização: Rio de Janeiro / São Paulo
- Contato:
Re: Substituição condicional em arquivo .dbf
Caro GianOp
aproveita e aprende logo o clipper, dá uma olhada nesse link que tem tudo mastigadinho....
viewtopic.php?f=19&t=8057
Muito Obrigado
aproveita e aprende logo o clipper, dá uma olhada nesse link que tem tudo mastigadinho....
viewtopic.php?f=19&t=8057
Muito Obrigado
Muito Obrigado,
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!

