Página 1 de 3
acesso a dbf de terceiros
Enviado: 29 Jul 2007 19:35
por Gelson
Preciso acessar um dbf de terceiros que é usados por outras máquinas da rede, pois faz tempos que pedi para criarem um relatório de NF emitidas no mês e nunca fizeram..
1º) Neste caso preciso usar algum parametro no meu fonte para não danificar ou não atrapalhar o acesso das outras máquinas ?
2º) No meu fonte gera um relatório de NF emitidas em um dado período porém de forma tradicional, como faço para que entre os nomes diferentes seja dado um espaço de umas duas linhas e colocado o total ?
ex:
nrazao valor
joaoc...... 1,00
joaoc..... 2,00
joaoc..... 3,00
total 6,00
// espaço duas linhas
joaod.... 2,00
joaod.... 10,00
joaod... 50,00
total 62,00
hoje ele está assim :
joaoc...... 1,00
joaoc..... 2,00
joaoc..... 3,00
joaod.... 2,00
joaod.... 10,00
joaod... 50,00
total... 68,00
Re: acesso a dbf de terceiros
Enviado: 29 Jul 2007 19:53
por sygecom
Gelson escreveu:1º) Neste caso preciso usar algum parametro no meu fonte para não danificar ou não atrapalhar o acesso das outras máquinas ?
Isso não tem problema desde que nem vc nem o outro sistema esteja usando em modo exclusivo....isso pensando que os dois são em clipper.
2º) No meu fonte gera um relatório de NF emitidas em um dado período porém de forma tradicional, como faço para que entre os nomes diferentes seja dado um espaço de umas duas linhas e colocado o total ?
Não entendi, vc quer dar duas linhas aonde ? no seu relatorio ? se for no relatorio...pode dar um :
Re: acesso a dbf de terceiros
Enviado: 29 Jul 2007 19:54
por Stanis Luksys
Gelson escreveu:1º) Neste caso preciso usar algum parametro no meu fonte para não danificar ou não atrapalhar o acesso das outras máquinas ?
Precisa só abrir de modo compartilhado com SHARED, no entanto se o programa lá abriu como exclusivo, não dá. O mais indicado seria copiar o arquivo todo para outra lugar e trabalhar com o novo.
Gelson escreveu:2º) No meu fonte gera um relatório de NF emitidas em um dado período porém de forma tradicional, como faço para que entre os nomes diferentes seja dado um espaço de umas duas linhas e colocado o total ?
Não sei o que significa "forma tradicional", mas para pular uma linha, é só colocar "?" no local onde deseja.
Falou!
Enviado: 29 Jul 2007 20:08
por Gelson
Óla, amigos do forum
Quanto ao dbf ser protegido ou não, vou pesquisar para ver as diferenças entre ser ou não ser protegido, para saber se ele é.
Chamei de tradicional porque não me veio a mente um nome melhor,
O relátorio gera assim, exemplo:
nome valor
carlos alberto 1,00
carlos alberto 2,00
carlos alberto 3,00
carlos batista 4,00
carlos batista 1,00
carlos celso 1,00
carlos celso 2,00
gostaria que quando nome mudasse fosse dado o espaço e ficasse assim
nome valor
carlos alberto 1,00
carlos alberto 2,00
carlos alberto 3,00
total 6,00
carlos batista 4,00
carlos batista 1,00
total 5,00
carlos celso 1,00
carlos celso 2,00
total 3,00
meu codigo ficou assim:
Código: Selecionar todos
@4,4 SAY 'DATA'
@4,14 SAY 'N. NF'
@4,24 say 'NOME'
@4,79 say 'VALOR'
mfolha = mfolha + 1
mlinha = 5
end
use nota2
@mlinha,4 SAY NDATAEM
@mlinha,14 SAY NNUMERONOT
@mlinha,24 SAY NRAZAO
@mlinha,68 SAY NVALORNOTA PICTURE '9,999,999,999.99'
mlinha = mlinha + 1
dbskip()
end
Enviado: 29 Jul 2007 20:32
por Maligno
Gelson escreveu:Quanto ao dbf ser protegido ou não, vou pesquisar para ver as diferenças entre ser ou não ser protegido, para saber se ele é.
Não. Os colegas se referem ao modo de abertura. Se o seu programa tentar abrir o arquivo em questão, ao mesmo tempo em que ele já se encontra aberto em modo exclusive em outra aplicação, logicamente, o acesso lhe será negado. Mas isso é fácil: tente abrir. Se não retornar erro, ótimo. Caso contrário, emita uma simples mensagem avisando da indisponibilidade temporária.
Esqueceram de falar: talvez você tenha de criar um índice temporário para ordenar de uma forma que talvez não exista nos índices do outro programa. Mas isso não é crítico. Só que terá de ser feito toda vez que alguém for emitir este relatório.
No demais, pra não causar prejuízo, basta não alterar nada no arquivo e fica tudo certo.
Para a questão do espaçamento do relatório também é simples: ao detectar a troca de nome, mande para a impressão um pulo de duas linhas, como o Leonardo sugeriu. Só que não precisa do espaço. Pode ser uma string nula que dá no mesmo.
Enviado: 30 Jul 2007 09:44
por Gelson
O dbf não está em modo protegido, ainda bem.
ao detectar a troca de nome
Ontem a noite fiquei lendo a apostila do clipper 5.2 e não achei o comando que faz esta leitura de um campo "C". Pelo que entendi preciso usar esta função ou comando, para que o programa identifique quando o nome mudou para poder enviar o comando para pular as linhas.
Enviado: 30 Jul 2007 09:55
por Pablo César
Gelson escreveu:não achei o comando que faz esta leitura de um campo "C".
Como assim ? Não entendí isso.
Gelson escreveu:preciso usar esta função ou comando, para que o programa identifique quando o nome mudou para poder enviar o comando para pular as linhas.
Para saber se os lançamento se referem a mesma pessoa, você primeiramente deverá atribuir o NOME ou CODIGO_CLIENTE a uma variável. E conforme você faz o SKIP você verificará o próximo registro se é igual a essa variavél, caso contrário (ELSE) você faz pular uma linha.
Enviado: 30 Jul 2007 10:40
por Maligno
Pelo que entendi preciso usar esta função ou comando, para que o programa identifique quando o nome mudou para poder enviar o comando para pular as linhas.
Conforme você mostra no seu modêlo de relatório: você tem de imprimir o total por nome, não é? Para fazer isso você já tem que detectar quando aquele nome "acabou". Pois bem: ao imprimir o total, apenas acrescente mais duas linhas.
Enviado: 30 Jul 2007 10:47
por Gelson
Maligno,
Hoje ele esta assim:
Nome valor
carlos alberto 1,00
carlos alberto 2,00
carlos alberto 3,00
carlos batista 4,00
carlos batista 1,00
carlos celso 1,00
carlos celso 2,00
Sem total por nome
Enviado: 30 Jul 2007 10:52
por Maligno
Numa outra mensagem você mostrou que tinha totais. Então, sou obrigado a supor que os totais são apenas um planejamento ainda. Não foi desenvolvido. Pois bem, o esquema é como o Pablo disse: declare uma variável que armazenará os nomes ou códigos dos indivíduos. Assim que, num SKIP, você perceber a troca do nome, imprime os totais do sujeito, acrescentando as linhas separadoras.
Enviado: 30 Jul 2007 11:37
por Pablo César
Isso, mesmo. Comparando a variavel com o conteúdo do campo onde está a identificação dos individuos...
Código: Selecionar todos
VCLI:=(1->NOME)
SKIP
IF !((1->NOME)=VCLI)
?
? "Total de "+ALLTRIM(VCLI)+": "+TRANSFORM(VTOTAL,"@E 9,999.99")
ENDIF
Quanto eu menciono (1->), quero me referir ao SELE 1 (a área em que você abriu o arquivo). esse alias, pode ser mudado, é claro.
Enviado: 30 Jul 2007 22:33
por Gelson
Olá amigos,
1º) Esta expresão abaixo está dizendo para remover os espaços em brancos que existerem no meu campo chamado Razão e em seguida pegar o valor numérico da variável vtotal e formata-la com as virgulas e o ponto separando as casas decimais . certo ?
? "Total de "+alltrim(razao)+" : "+transform(vtotal,"@E9,999.99")
Se for isto não entendi o porque de não estar funcionando, comentando ou não a linha no fonte nada muda.
Assim que, num SKIP, você perceber a troca do nome, imprime os totais do sujeito, acrescentando as linhas separadoras
Como proceder para que o total dos sujeitos não sejam acumulados ? Exemplo no total do segundo sujeito está sendo somado o total do primeiro sujeito, no total do terceito sujeito esta entrado o total do 1º mais o do 2º e assim vai.
Enviado: 31 Jul 2007 01:24
por sygecom
? "Total de "+alltrim(razao)+" : "+transform(vtotal,"@E9,999.99")
Se for isto não entendi o porque de não estar funcionando, comentando ou não a linha no fonte nada muda.
Veja que no exemplo que o Pablo postou essa linha esta dento de uma condição...lhe pergunto essa condição esta sendo executada ? pq se não tiver passando por dentro da condição....ele não vai mostrar o resultado...ou seja tanto faz vc ter essa Linha no fonte ou não...entendeu ?
Como proceder para que o total dos sujeitos não sejam acumulados ? Exemplo no total do segundo sujeito está sendo somado o total do primeiro sujeito, no total do terceito sujeito esta entrado o total do 1º mais o do 2º e assim vai.
A cada vez que vc apresentar um total logo abaixo vc pode zerar a variavel...segue abaixo um exemplo:
Código: Selecionar todos
IF !((1->NOME)=VCLI)
?
? "Total de "+ALLTRIM(VCLI)+": "+TRANSFORM(VTOTAL,"@E 9,999.99")
vTOTAL=0
ENDIF
Abraços
Leonardo Machado
Enviado: 31 Jul 2007 07:32
por filizola
amigo, como disse o maligno, crie um indice temporario.
use seu_arquivo_de_notas
index on nome,nf to temp for datanf>inicio-1 .and. datanf<fim+1
@ 01,01 say cabecalho
@ 02,01 say "nome valor"
@ 03,01 say repl("-",79)
lin=4
do while !eof()
nomep=nome
tnome=0
do while !eof() .and. nome=nomep
@ lin,01 say nomep
@ lin,40 say valor pict "@e 99,999.99"
++lin
tnome+=valor
skip
enddo
@ lin,40 say tnome pict "@e 99,999.99"
lin+=2
enddo
espero ter ajudado.
Enviado: 31 Jul 2007 07:37
por Pablo César
sygecom escreveu:A cada vez que vc apresentar um total logo abaixo vc pode zerar a variavel
Isso aí Leonardo, isso também me lembrou que a variável VCLI (digamos) deve ser re-atribuida.
Código: Selecionar todos
IF !((1->NOME)=VCLI)
?
? "Total de "+ALLTRIM(VCLI)+": "+TRANSFORM(VTOTAL,"@E 9,999.99")
VTOTAL=0
VCLI:=(1->NOME)
ENDIF
Se for isto não entendi o porque de não estar funcionando
É porque a variável VCLI ficava sempre com o memsmo valor, é por isso que não funcionava.