Página 1 de 1

Atualizar Banco de Dados

Enviado: 02 Jun 2015 17:57
por Josmar dos Santos
Boa tarde, estou tendo alguns problemas com atualização de banco de dados. O procedimento é o seguinte: O usuário tem um DBF chamado de CUSTO. Ele lança um determinado valor nesse custo e esse valor será enviando para outro DBF chamado de ORDEM. Ele chama o número da ordem nesse CUSTO trazendo os dados do cliente e após a confirmação de dados o mesmo enviará os valores para um campo na ORDEM chamado de REFERENCIA. Todas as vezes que ele for lançando os valores serão somados com esse campo. É tipo uma baixa no estoque, só que esse é ao contrário, ele soma em vez de subtrair. Acontece que já aconteceu duas vezes de após fazer os lançamentos, os valores não somaram com esse campo. Será que estou fazendo alguma coisa errada. Deixo o código pra vocês avaliarem...


Josmar

Função grava:

Código: Selecionar todos

 FUNCTION GRAVA( M_RELACAO, M_AREA, M_ORDEM, M_LER, M_GRAVA, M_OPERA )
LER_CAMPO := &M_LER
M_AREATUA := ALLTRIM( STR( SELECT(), 3 ) )
SELE &M_AREA
SET ORDER TO M_ORDEM
SEEK M_RELACAO
IF EOF()
   MENSAGEM( "Dados n„o cadastrados", 3 )
   SELE &M_AREATUA
   RETURN .T.
ELSE
   IF !REGLOCK( 5 )
      BEEP()
      MENSAGEM( "Atualiza‡„o n„o foi bem sucedida", 3 )
      SELE &M_AREATUA
      RETURN .F.
   ENDIF
   IF M_OPERA = "="
      REPLACE &M_GRAVA WITH LER_CAMPO
   ELSEIF M_OPERA = "+"
      REPLACE &M_GRAVA WITH &M_GRAVA+LER_CAMPO
   ELSE
      REPLACE &M_GRAVA WITH &M_GRAVA-LER_CAMPO
   ENDIF
   UNLOCK
ENDIF
SELE &M_AREATUA
RETURN .T.   
Cadastro de Custos->Função que salva os dados para o DBF

Código: Selecionar todos

FUNCTION SALVAR( TIPO_ACAO ) 
LOCAL IRetorno := .F.
IF TIPO_ACAO = INCLUSAO
   CUSTO->(Dbappend())
   cLANC_PEC := alltrim( STRZERO( PSQCONTROLE( "CUSTO" ), 6 ))
   if cLANC_PEC="000000"
      ALERT("Ocorreu um erro na efetiva‡Æo do CODIGO SEQUENCIAL")
      RETURN .F.
   ENDIF
   CUSTO->LANC_PEC := cLANC_PEC
   ALERT("Numero gerado no arquivo: " +cLANC_PEC)
ELSE
   CUSTO->(RLOCK() )
ENDIF
IF .NOT. NETERR()
 CUSTO->DAT_PEC := M->DAT_PEC
 CUSTO->ORD_PEC := M->ORD_PEC
 CUSTO->CODC_PEC := M->CODC_PEC
 CUSTO->NOMC_PEC := M->NOMC_PEC
 CUSTO->VEIC_PEC := M->VEIC_PEC
 CUSTO->PLAC_PEC := M->PLAC_PEC
 CUSTO->CODF_PEC := M->CODF_PEC
 CUSTO->NOMF_PEC := M->NOMF_PEC
 CUSTO->TIPD_PEC := M->TIPD_PEC
 CUSTO->NROD_PEC := M->NROD_PEC
 CUSTO->CODE_PEC := M->CODE_PEC
 CUSTO->NOME_PEC := M->NOME_PEC
 CUSTO->VAL_PEC := M->VAL_PEC
 CUSTO->IMP_PEC := M->IMP_PEC
 CUSTO->VAL1_PEC := M->VAL1_PEC
 CUSTO->HIS1_PEC := M->HIS1_PEC
 CUSTO->HIST3_PEC := M->HIST3_PEC
 CUSTO->RAZF_PEC := M->RAZF_PEC 
 GRAVA(M->ORD_PEC,"ORDEM",8,"VAL1_PEC","CONTROLE","+")
 CUSTO->( DBCOMMIT() )
 CUSTO->( DBUNLOCK() )
ELSE
   ALERT("Falha ao incluir nova ordem")
endif
return .t.
Josmar

Atualizar Banco de Dados

Enviado: 02 Jun 2015 18:43
por Itamar M. Lins Jr.
A lógica é meio complicada de entender.
Mas cadê as outras rotinas que chama a função grava() ? Porque pode passar o sinal "=" e substituir com qualquer valor.
Outro problema, é que na função salva, se a linha 6 falhar vai adicionar um registro em branco no dbf.

Saudações,
Itamar M. Lins Jr.

Atualizar Banco de Dados

Enviado: 03 Jun 2015 07:48
por Josmar dos Santos
Bom dia Itamar, só retificando, o campo REFERENCIA que eu havia sitado, na verdade se chama CONTROLE. Itamar essa função grava() eu peguei do gerador MIRO3. A rotina que chamo a função grava é essa na linha
34 da função salvar() onde:

que através do ord_pec(custo.dbf) vai até a ordem.dbf(set ordem to 8). Insiro o valor de val1_pec(custo.dbf) e soma esses valores com o controle(ordem.dbf)

Quanto ao registro em branco que vc sitou, se vc tiver alguma sugestão eu agradeceria. E se tiver alguma outra ideia de como eu fazer essas somas no campo controle da ordem.dbf sinta se a vontade para alterar o código.


Josmar

Atualizar Banco de Dados

Enviado: 03 Jun 2015 10:57
por Itamar M. Lins Jr.
Se, é apenas para somar remova as outras opções.
Na função salvar, passar a linha 4 dbappend para a linha 9, já que vai subir uma linha.
Quando vc passa os parâmetros, vc passa qual ? FIELD ou MEMVAR ?

GRAVA(M->ORD_PEC,"ORDEM",8,"VAL1_PEC","CONTROLE","+") //Isso é o quê ? campos do DBF ou Variáveis de memória ?(VAL1_PEC)

Saudações,
Itamar M. Lins Jr.

Atualizar Banco de Dados

Enviado: 03 Jun 2015 13:19
por Josmar dos Santos
Boa tarde Itamar.
ORD_PEC -> Campo do CUSTO.DBF de onde registro os valores para ir para a ORDEM.DBF
ORDEM-> Arquivo DBF
VAL1_PEC -> Campo do CUSTO.DBF
CONTROLE-> Campo da ORDEM.DBF

Resumindo: Através do campo ORD_PEC é feita uma amarração com a ORDEM.DBF, ou seja, ele trás o nome do cliente, endereço, etc. Depois eu insiro o valor do custo nesse campo VAL1_PEC que envia o mesmo para o CONTROLE.DBF e vai somando conforme necessário.

Josmar

Atualizar Banco de Dados

Enviado: 03 Jun 2015 14:05
por Josmar dos Santos
Esqueci de mencionar uma coisa: Perguntei ao usuário se ele observou alguma ocorrência para gerar esse erro de soma e ele me respondeu da seguinte maneira: Ao gerar o registro, o mesmo travou. Ele se retirou do local e após retornar, notou q o sistema havia registrado o cadastro e destravado, porém não somou com o valor do campo CONTROLE.

Josmar