Ir para conteúdo
  • Cadastre-se

Painel de líderes

Conteúdo popular

Showing content with the highest reputation on 21-07-2017 em Posts

  1. Boa tarde. Devido ao fato de diversos bancos trabalharem de forma separada a cobrança da multa e da mora diária, foi criada no titulo a propriedade DataMulta e alterada a rotina AdicionarMensagensPadroes() para utilizar a mesma ao invés da DataJurosMora na decisão da impressão da mensagem referente a cobrança da Multa a partir de uma determinada ou após o vencimento. *** Implementação Anterior *** if PercentualMulta <> 0 then begin if DataMoraJuros <> 0 then AStringList.Add(ACBrStr('Cobrar Multa de ' + FormatCurr('R$ #,##0.00', IfThen(MultaValorFixo, PercentualMulta, ValorDocumento*( 1+ PercentualMulta/100)-ValorDocumento)) + ' a partir '+FormatDateTime('dd/mm/yyyy',ifthen(Vencimento = DataMoraJuros, IncDay(DataMoraJuros,1),DataMoraJuros)))) else AStringList.Add(ACBrStr('Cobrar Multa de ' + FormatCurr('R$ #,##0.00', IfThen(MultaValorFixo, PercentualMulta, ValorDocumento*( 1+ PercentualMulta/100)-ValorDocumento)) + ' após o vencimento.')); end; *** Nova Implementação *** if PercentualMulta <> 0 then begin if DataMulta <> 0 then AStringList.Add(ACBrStr('Cobrar Multa de ' + FormatCurr('R$ #,##0.00', IfThen(MultaValorFixo, PercentualMulta, ValorDocumento*( 1+ PercentualMulta/100)-ValorDocumento)) + ' a partir '+FormatDateTime('dd/mm/yyyy',ifthen(Vencimento = DataMulta, IncDay(DataMulta,1),DataMulta)))) else AStringList.Add(ACBrStr('Cobrar Multa de ' + FormatCurr('R$ #,##0.00', IfThen(MultaValorFixo, PercentualMulta, ValorDocumento*( 1+ PercentualMulta/100)-ValorDocumento)) + ' após o vencimento.')); end; Com esta mudança se faz necessário passar ao componente além da propriedade DataMoraJuros (responsável pela mensagem da Mora), também a propriedade DataMulta, afim de que a mesma seja considerada na impressão das mensagens do boleto. Att.
    3 pontos
  2. Sim com certeza. Isso é uma necessidade já observada.
    2 pontos
  3. Boa tarde, Estou com alguns casos de bancos diferentes com a rejeição no arquivo remessa em homologação devido a mensagem de protesto destacada no arquivo. Os bancos estão rejeitando o acento na palavra "Após". Até o momento nunca tive rejeição como esta, gostaria de saber se houve algum ajuste ou alguém esta passando pela mesma dificuldade. Mensagem: (PROTESTAR EM 0 DIAS CORRIDOS APóS O VENCIMENTO) Fico no aguardo! Muito obrigada
    1 ponto
  4. Boa tarde, Na geração do arquivo do ECF, alguns campos inteiros estão entrando no LFill de Data, gerando a informação errada. Verifiquei neste post LFill Integer x Data que isso já ocorreu em alguns situações. Para corrigir, passei o tamanho do campo no segundo parâmetro do LFill e garantiu a utilização da função correta nos itens a seguir: 1. 0020 procedure TBloco_0.WriteRegistro0020; LFill(IND_QTE_SCP, 3) 2. Y620 procedure TBloco_Y.WriteRegistroY620; LFill(IND_RELAC, 1) LFill(PAIS, 3) 3. M010 procedure TBloco_M.WriteRegistroM010(RegM001: TRegistroM001); LFill(COD_LAN_ORIG, 6) 4. L100 procedure TBloco_L.WriteRegistroL100(RegL030: TRegistroL030); LFill(NIVEL, 3) 5. L300 procedure TBloco_L.WriteRegistroL300(RegL030: TRegistroL030); LFill(NIVEL, 3) Seguem os fontes em ACBr.rar. Renato Rubinho Analista de Sistemas http://linkedin.com.br/in/renatorubinho ACBr.rar
    1 ponto
  5. Sim, minha TRIGGER é INSERT ou UPDATE. Esse pequeno exemplo seria de entrada "COMPRA", para VENDA é só fazer ao contrário... Se a compra é cancelada concorda que o campo CONFIRMADO muda de True para False? Como eu disse, existem várias formas e momentos de mexer no estoque. Então, algo parecido com isso ....continua --SE A COMPRA ESTA SENDO CANCELADA if ((OLD.CONFIRMADO='True') AND (NEW.CONFIRMADO='False')) then begin FOR SELECT CODIGOPRODUTO, QUANTIDADE FROM COMPRAITENS WHERE COMPRAITENS.NUMEROCOMPRA=NEW.NUMEROCOMPRA INTO :CODPRO, :QTDE DO begin UPDATE PRODUTOS SET PRODUTOS.QUANTIDADE = COALESCE(PRODUTOS.QUANTIDADE,0) - COALESCE(:QTDE,0) WHERE CODIGOPRODUTO = :CODPRO; ...continua
    1 ponto
  6. 1 ponto
  7. Sugiro, usar a solução do ACBr, removendo a sua solução do seu aplicativo.
    1 ponto
  8. Segue abaixo as alterações realizadas nos arquivos ACBrBoleto.pas e ACBrBancoCaixa.pas citadas no primeiro post. Atualizei os arquivos e descrevi abaixo minhas alterações. {Arquivo ACBrBoleto.pas} ========================================================================================== {Metodo Antigo - No arquivo ACBrBancoCaixa.pas o metodo "CodOcorrenciaToTipo" retorna apenas "TipoRetorno" e não "TipoRemessa"} function TACBrBanco.CodOcorrenciaToTipoRemessa(const CodOcorrencia: Integer ) : TACBrTipoOcorrencia; begin Result:= fBancoClass.CodOcorrenciaToTipo(CodOcorrencia); <<<< antigo end; {Metodo Alterado - Criei um metodo que retorna apenas os "TipoRemessa"} function TACBrBanco.CodOcorrenciaToTipoRemessa(const CodOcorrencia: Integer ) : TACBrTipoOcorrencia; begin Result:= fBancoClass.CodOcorrenciaToTipoRemessa(CodOcorrencia); <<<< novo end; {Metodo Adicionado} function TACBrBanco.TipoOcorrenciaToCodRemessa(const TipoOcorrencia: TACBrTipoOcorrencia ) : String; begin Result:= fBancoClass.TipoOcorrenciaToCodRemessa(TipoOcorrencia); end; {Metodo Adicionado} function TACBrBancoClass.TipoOcorrenciaToCodRemessa(const TipoOcorrencia : TACBrTipoOcorrencia ) : String ; begin Result := '01'; end ; {Arquivo ACBrBancoCaixa.pas} ========================================================================================== {Metodo Adicionado} function TACBrCaixaEconomica.CodOcorrenciaToTipoRemessa( const CodOcorrencia: Integer): TACBrTipoOcorrencia; begin case CodOcorrencia of 02: Result := toRemessaBaixar; 04: Result := toRemessaConcederAbatimento; 05: Result := toRemessaCancelarAbatimento; 06: Result := toRemessaAlterarVencimento; 07: Result := toRemessaConcederDesconto; 08: Result := toRemessaCancelarDesconto; 09: Result := toRemessaProtestar; 10: Result := toRemessaCancelarInstrucaoProtestoBaixa; 11: Result := toRemessaCancelarInstrucaoProtesto; 13: Result := toRemessaDispensarJuros; 31: Result := toRemessaAlterarNomeEnderecoSacado; else Result := toRemessaRegistrar; end; end; {Metodo Adicionado} function TACBrCaixaEconomica.TipoOcorrenciaToCodRemessa(const TipoOcorrencia: TACBrTipoOcorrencia): string; begin case TipoOcorrencia of toRemessaBaixar : Result := '02'; toRemessaConcederAbatimento : Result := '04'; toRemessaCancelarAbatimento : Result := '05'; toRemessaAlterarVencimento : Result := '06'; toRemessaConcederDesconto : Result := '07'; toRemessaCancelarDesconto : Result := '08'; toRemessaProtestar : Result := '09'; toRemessaCancelarInstrucaoProtestoBaixa: Result := '10'; toRemessaCancelarInstrucaoProtesto : Result := '11'; toRemessaDispensarJuros : Result := '13'; toRemessaAlterarNomeEnderecoSacado : Result := '31'; else Result := '01'; end; end; {Criei o metodo "TipoOcorrenciaToCodRemessa" com o conteudo do case} {Metodo Antigo} function TACBrCaixaEconomica.GerarRegistroTransacao240(ACBrTitulo : TACBrTitulo): String; begin ... case OcorrenciaOriginal.Tipo of toRemessaBaixar : ATipoOcorrencia := '02'; toRemessaConcederAbatimento : ATipoOcorrencia := '04'; toRemessaCancelarAbatimento : ATipoOcorrencia := '05'; toRemessaAlterarVencimento : ATipoOcorrencia := '06'; toRemessaConcederDesconto : ATipoOcorrencia := '07'; toRemessaCancelarDesconto : ATipoOcorrencia := '08'; toRemessaProtestar : ATipoOcorrencia := '09'; toRemessaCancelarInstrucaoProtestoBaixa: ATipoOcorrencia := '10'; toRemessaCancelarInstrucaoProtesto : ATipoOcorrencia := '11'; toRemessaDispensarJuros : ATipoOcorrencia := '13'; toRemessaAlterarNomeEnderecoSacado : ATipoOcorrencia := '31'; else ATipoOcorrencia := '01'; end; ... end; {Metodo Alterado} function TACBrCaixaEconomica.GerarRegistroTransacao240(ACBrTitulo : TACBrTitulo): String; begin ... ATipoOcorrencia := TipoOcorrenciaToCodRemessa(OcorrenciaOriginal.Tipo); ... end; Tá aí minha contribuição. Espero ter ajudado! Desde já agradeço a oportunidade! ACBrBoleto.pas ACBrBancoCaixa.pas
    1 ponto
  9. Bom dia Instalei também no Delphi 7 e tive que alterar (concatenar ) o nome do serviço por motivo de limite de caracteres na linha em anexo a unit corrigida Obrigado pnfsConversao.pas
    1 ponto
  10. Como eu disse anteriormente, disparo a TRIGGER somente na confirmação da minha venda. No INSERT ou UPDATE, verifico o estado de um campo chamado CONFIRMADO, na tabela MASTER e disparo essa TRIGGER através dele. Algo mais ou menos assim: --SE A COMPRA ESTA SENDO CONFIRMADA if ((OLD.CONFIRMADO='False') AND (NEW.CONFIRMADO='True')) then begin FOR SELECT CODIGOPRODUTO, QUANTIDADE FROM COMPRAITENS WHERE COMPRAITENS.NUMEROCOMPRA=NEW.NUMEROCOMPRA INTO :CODPRO, :QTDE DO begin UPDATE PRODUTOS SET PRODUTOS.QUANTIDADE = COALESCE(PRODUTOS.QUANTIDADE,0) + COALESCE(:QTDE,0) WHERE CODIGOPRODUTO = :CODPRO; .......continua. Varia muito da necessidade de cada ERP...
    1 ponto
  11. 1 ponto
  12. Bom dia! Verifiquei que ao montar o arquivo remessa da Caixa Econômica federal, estão inserindo a DataMoraJuros no lugar da DataMulta. Isso obriga que a cobrança da Multa seja cobrada sempre a partir da mesma data que o juros de mora ao dia. Se eu não estiver errado, essas datas são independentes, por isso fiz as alterações necessárias para corrigir este problema. Segue em anexo os arquivos alterados. ACBrBancoCaixa.pas ACBrBoleto.pas
    1 ponto
  13. Mando assim veja se tem algo diferente. DM.ACBrBoleto1.LayoutRemessa := c240; with DM.ACBrBoleto1.Banco do begin Nome := DmFd.FDQ_Boletos.FieldByName('BANCO_NOME').AsString; Numero := StrToInt(DmFd.FDQ_Boletos.FieldByName('BANCO_NRO').AsString); case DmFd.FDQ_Boletos.FieldByName('BANCO_NRO').AsInteger of 1 : TipoCobranca := cobBancoDoBrasil; 33 : TipoCobranca := cobSantander; 104 : TipoCobranca := cobCaixaEconomica; 237 : TipoCobranca := cobBradesco; 341 : TipoCobranca := cobItau; 748 : TipoCobranca := cobSicred; 756 : TipoCobranca := cobBancoob; //SICOOB end; end; with DM.ACBrBoleto1.Cedente do //Beneficiario begin Agencia := DmFd.FDQ_Boletos.FieldByName('AGENCIA_NRO').AsString; AgenciaDigito := DmFd.FDQ_Boletos.FieldByName('AGENCIA_NRO_DIG').AsString; Conta := DmFd.FDQ_Boletos.FieldByName('CONTA').AsString; ContaDigito := DmFd.FDQ_Boletos.FieldByName('CONTA_DIG').AsString; Convenio := DmFd.FDQ_Boletos.FieldByName('CONVENIO').AsString; // Modalidade := IBDS_boleto.FieldByName('CONVENIO').AsString; CodigoCedente := DmFd.FDQ_Boletos.FieldByName('CEDENTE_COD').AsString; Nome := DmFd.FDQ_Boletos.FieldByName('CEDENTE_NOME').AsString; CNPJCPF := so_numeros(Dm.empCNPJ); Logradouro := tira_acento(trim(Dm.empEnder)); NumeroRes := trim(Dm.empNro); Complemento := tira_acento(trim(Dm.empCompl)); Bairro := tira_acento(trim(Dm.empBairro)); Cidade := tira_acento(Dm.empCid); UF := Dm.empUF; CEP := Dm.empCEP; case StrToInt(DmFd.FDQ_Boletos.FieldByName('BANCO_NRO').AsString) of 756 : Modalidade := '01'; 001 : Modalidade := '027'; end; if (Length(CNPJCPF) = 11) then TipoInscricao := pFisica else TipoInscricao := pJuridica; end; DM.ACBrBoleto1.ListadeBoletos.Clear; for I := 0 to NrTitulos - 1 do begin Abrir(emp, Boletos[i]); //Abre a tabela do boleto coms os dados Titulo := DM.ACBrBoleto1.CriarTituloNaLista; with Titulo do begin DataProcessamento := Now; DataDocumento := DmFd.FDQ_Boletos.FieldByName('DATA_INC').AsDateTime; Vencimento := DmFd.FDQ_Boletos.FieldByName('DT_VENCTO').AsDateTime; Carteira := DmFd.FDQ_Boletos.FieldByName('CARTEIRA').AsString; NumeroDocumento := DmFd.FDQ_Boletos.FieldByName('N_DOC').AsString; NossoNumero := DmFd.FDQ_Boletos.FieldByName('N_NUMERO').AsString; SeuNumero := DmFd.FDQ_Boletos.FieldByName('CODIGO').AsString; //DmFd.FDQ_Boletos.FieldByName('COD_CONTA').AsString; EspecieDoc := DmFd.FDQ_Boletos.FieldByName('ESPECIE').AsString; //EspecieMod := '01'; Aqui para BANCOOP, se precisar ValorDocumento := DmFd.FDQ_Boletos.FieldByName('VALOR').AsFloat; ValorDesconto := DmFd.FDQ_Boletos.FieldByName('DESCONTO').AsFloat; //VALOR, Se percentual calcular o valor na hora de gerar o boleto e passar o valor. DataDesconto := 0; //AQUI Adicionar ValorAbatimento := 0; //AQUI Adicionar PercentualMulta := DmFd.FDQ_Boletos.FieldByName('MULTA').AsFloat; //Percentual ValorMoraJuros := DmFd.FDQ_Boletos.FieldByName('JUROS').AsFloat; //VALOR, Se percentual calcular o valor na hora de gerar o boleto e passar o valor. //DataMoraJuros := DmFd.FDQ_Boletos.FieldByName('DT_JUROS').AsFloat; //AQUI Adicionar. 0 A contar do atraso DataBaixa := DmFd.FDQ_Boletos.FieldByName('DT_VENCTO').AsDateTime + 90; case DM.ACBrBoleto1.Banco.TipoCobranca of cobBancoob : begin CodigoMora := '2'; //SICOOB if (ValorMoraJuros > 0) then Instrucao1 := '01'; //Mandar a instrução 01 já na remessa. 01 - Cobrar juros e 07 não protestar end; end; DataProtesto := DmFd.FDQ_Boletos.FieldByName('DT_PROT').AsDateTime; //Mandar data como zero, sem protesto if (DataProtesto > 0) then TipoDiasProtesto := diCorridos; case AnsiIndexStr(DmFd.FDQ_Boletos.FieldByName('ACEITE').AsString, ['A', 'S', 'N', 'B']) of 0 : Aceite := atAceite; 1 : Aceite := atSim; 2 : Aceite := atNao; 3 : Aceite := atBNao; end; Sacado.NomeSacado := tira_acento(DmFd.FDQ_Boletos.FieldByName('SACADO').AsString); Sacado.CNPJCPF := DmFd.FDQ_Boletos.FieldByName('CPF_CNPJ').AsString; Sacado.Logradouro := tira_acento(DmFd.FDQ_Boletos.FieldByName('ENDERECO').AsString); Sacado.Numero := DmFd.FDQ_Boletos.FieldByName('NRO').AsString; Sacado.Bairro := tira_acento(DmFd.FDQ_Boletos.FieldByName('BAIRRO').AsString); Sacado.Cidade := tira_acento(DmFd.FDQ_Boletos.FieldByName('NOMECID').AsString); Sacado.UF := DmFd.FDQ_Boletos.FieldByName('UF').AsString; LocalPagamento := tira_acento(DmFd.FDQ_Boletos.FieldByName('LOC_PAGTO').AsString); if (remessa > 0) then //remesa 0 impressão e 1 remessa Sacado.CEP := so_numeros(DmFd.FDQ_Boletos.FieldByName('CEP').AsString) else Sacado.CEP := DmFd.FDQ_Boletos.FieldByName('CEP').AsString; if (Length( so_numeros(Sacado.CNPJCPF)) = 11) then Sacado.Pessoa := pFisica else Sacado.Pessoa := pJuridica; if (remessa = 0) then ////remesa 0 impressão e 1 remessa begin if (Trim(DmFd.FDQ_Boletos.FieldByName('INSTRUCOES').AsString) <> '') then Mensagem.Text := tira_acento(DmFd.FDQ_Boletos.FieldByName('INSTRUCOES').AsString); if (Trim(DmFd.FDQ_Boletos.FieldByName('INSTRUCOES2').AsString) <> '') then Mensagem.Text := Mensagem.Text + tira_acento(DmFd.FDQ_Boletos.FieldByName('INSTRUCOES2').AsString); if (Trim(DmFd.FDQ_Boletos.FieldByName('INSTRUCOES3').AsString) <> '') then Mensagem.Text := Mensagem.Text + tira_acento(DmFd.FDQ_Boletos.FieldByName('INSTRUCOES3').AsString); end; DM.ACBrBoleto1.AdicionarMensagensPadroes(Titulo, Mensagem); //ACBrBoleto.Banco.MontarCampoNossoNumero() end; end; DM.ACBrBoleto1.ChecarDadosObrigatorios; if (remessa = 0) then //0 Imprimir e 1 remessa begin DM.ACBrBoleto1.Imprimir; DM.ACBrBoleto1.GerarPDF; end else DM.ACBrBoleto1.GerarRemessa(remessa); Minha função de emissão é basicamente esta. Veja se te ajuda.
    1 ponto
  14. Boa tarde a todos, Em fim o Portal Nacional do BP-e. https://bpe-portal.sefazvirtual.rs.gov.br/
    1 ponto
  15. Boa tarde Juliomar! Isso está parecendo alguma configuração de conexão ao banco que ficou aí em seus parâmetros. Dá uma verificada no Driveid para ver se não é por lá o problema!
    1 ponto
  16. fbclient.dll para win32?
    1 ponto
  17. Aqui nos clientes com Windows XP foi só instalar as atualizações de segurança do Windows update também que voltou a funcionar
    1 ponto
  18. Implementei tratamento para o MVG6 da Toledo bem como fiz algumas melhorias no componente. Em cada ponto que tratava uma balança, tinha-se que ficar passando um arquivo Tstring para poder gerar o arquivo correspondente. Criei uma classe para que possa ser tratado qualquer tipo de registro para a balança. Assim bata no leiaute da balança criar o arquivo que se deseja, bem como definir o nome para o mesmo. Todas as demais funções existentes para geração dos arquivos, continuam operacionais mesmo com as mudanças. Efetuei os ajustes em cada geração de balança. Não tratei nenhuma propriedade nova para os leiautes que já existiam. ACBrCargaBal.pas
    1 ponto
  19. Fiz uma implementação que retorna uma resposta mais específica quando se lê um arquivo PRÉ-CRÍTICA. Talvez ajude.
    1 ponto
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...