Layout Nota Fiscal
Pessoal;
Preciso desenvolver um relatorio que emita uma nota fiscal por uam impressora matricial, o caso é que o usuario que informará as dimensoes dos dados impressos, ele informara ao sistema que o Campo X terá 4,5cm de altura e 2,0 cm de posição quanto a margem da esquerda para direita, o caso é como poderei enviar para impressora esses dados e imprimir os campos de acordo com a configuração do usuario??
Preciso desenvolver um relatorio que emita uma nota fiscal por uam impressora matricial, o caso é que o usuario que informará as dimensoes dos dados impressos, ele informara ao sistema que o Campo X terá 4,5cm de altura e 2,0 cm de posição quanto a margem da esquerda para direita, o caso é como poderei enviar para impressora esses dados e imprimir os campos de acordo com a configuração do usuario??
Cd.wagner.sena
Curtidas 0
Respostas
Vitor Alcantara
26/07/2007
Eu gosto utilizar em meu programas o gerador de relatórios FortesReport pois ele tem um filtro que imprime em uma velocidade quase que parecida com a impressão direta, fazendo assim ficar muito mais fácil eu desenhar o form na tela e configurar o posicionamento dos campos em RunTime do que enviar direto para porta da impressora.
Uma coisa que geralmente atrapalha o posicionamento dos campos é que eles são passados em Pixels e não em Centímetros/Milímetros , para contornar isso eu utilizo uma pequena função que converte Milímetros para Pixels.
Aqui está a função:
Dai é só você criar no banco ou em um arquivo os valores onde cada campo deverá se encontrar na posição Top e Left em milímetros em relação a RlBand que ele se encontra (Cabeçalho(btHeader) , Detalhe(btDetail) e Rodapé(btFooter)), ai é só posicionar os campos de acordo com os valores gravados no OnCreate do Form que irá conter o relatório.
Ex:
Uma coisa que geralmente atrapalha o posicionamento dos campos é que eles são passados em Pixels e não em Centímetros/Milímetros , para contornar isso eu utilizo uma pequena função que converte Milímetros para Pixels.
Aqui está a função:
Function MMToInc(Valor:Double):Integer; var n : real; DC : integer; begin dc := GetWindowDC(GetDesktopWindow); dc := GetDeviceCaps(dc,LOGPIXELSX); n := (Valor /10)*Dc /2.54; Result:= trunc(n); end;
Dai é só você criar no banco ou em um arquivo os valores onde cada campo deverá se encontrar na posição Top e Left em milímetros em relação a RlBand que ele se encontra (Cabeçalho(btHeader) , Detalhe(btDetail) e Rodapé(btFooter)), ai é só posicionar os campos de acordo com os valores gravados no OnCreate do Form que irá conter o relatório.
Ex:
procedure TRelatNF.FormCreate(Sender: TObject);
begin
NSelo := FormCriaRelNF.SpNFNumSelo.AsInteger;
NForm := FormCriaRElNF.SpNFNumForm.AsInteger;
With FormCriaRelNf do
Begin
{Cabeçalho}
CABECALHO.Height := MMToInc(SpNFCab_Altura.Value);//Altura do cabesalho;
{Rodapé}
RODAPE.Height := MMToInc(SpNFRod_Altura.Value);//Altura do rodapé;
{Margens do detalhe}
Margem_Detalhe_Superior.Height := MMToInc(SpNFDet_Margem_Sup.Value);//Margem superior do detalhe
Margem_Detalhe_Inferior.Height := MMToInc(SpNFDet_Margem_Inf.Value);//Margem inferior do detalhe
{Campos do cabeçalho}
DbCab_XSai.Top := MMToInc(SpNFCab_X_Saida_Top.Value);//Posição y do x da saída
DbCab_XSai.Left := MMToInc(SpNFCab_X_Saida_Esq.Value);//Posição x do x da saída
DbCab_XEnt.Top := MMToInc(SpNFCab_X_Entrada_Top.Value);//Posição y do x da entrada
DbCab_XEnt.Left := MMToInc(SpNFCab_X_Entrada_Esq.Value);//Posição x do x da entrada
DbNumNota.Top := MMToInc(SpNFCab_Num_Nota_Top.Value);//Posição y do nº da nota
DbNumNota.Left := MMToInc(SpNFCab_Num_Nota_Esq.Value);//Posição x do nº da nota
{1º linha do cabeçalho}
DbCab_L1_NatOper.Top := MMToInc(SpNFCab_Linha1_Top.Value);
DbCab_L1_CFOP.Top := MMToInc(SpNFCab_Linha1_Top.Value);
DbCab_L1_NatOper.Left := MMToInc(SpNFCab_Nat_Oper_Esq.Value);
DbCab_L1_CFOP.Left := MMToInc(SpNFCab_CFOP_Esq.Value);
{2º linha do cabeçalho}
DbCab_L2_Nome.Top := MMToInc(SpNFCab_Linha2_Top.Value);
DbCab_L2_CNPJ.Top := MMToInc(SpNFCab_Linha2_Top.Value);
DbCab_L2_Data.Top := MMToInc(SpNFCab_Linha2_Top.Value);
DbCab_L2_Nome.Left := MMToInc(SpNFCab_RazaoSoc_Esq.Value);
DbCab_L2_CNPJ.Left := MMToInc(SpNFCab_CNPJ_Esq.Value);
DbCab_L2_Data.Left := MMToInc(SpNFCab_DataEmis_Esq.Value);
........
GOSTEI 0
Virus69
26/07/2007
Eu sempre uso a rotina do RDPrint
procedure TFrmNotaFiscal.NOTAClick(Sender: TObject);
var
subtotal, total : currency;
linha : integer;
natureza : String[40];
begin
DM.IBClientes.close;
DM.IBClientes.SelectSQL.Clear;
DM.IBClientes.SelectSQL.add(´SELECT * FROM CLIENTES´);
DM.IBClientes.SelectSQL.ADD(´WHERE CODIGO = ´ + QuotedStr(dm.IBNotaCODCLI.Text) + ´´);
DM.IBClientes.Open;
total := 0;
// Parametros para o NOTA FISCAL...
rdprint1.TamanhoQteLinhas := 66; //66 Linhas (deve ser 1 quando for CUPOM)
rdprint1.TamanhoQteColunas := 96; // Largura da Bobina aprox. 7 cm (7 / 2.54 * 20)
rdprint1.FonteTamanhoPadrao := s20cpp; // Fonte Comprimido em 20 cpp
rdprint1.OpcoesPreview.Preview := FALSE;
RDprint1.PortaComunicacao := FRMPrincipal.EdImpressao.Text;
RDprint1.Abrir;
Inc (linha);
inc (linha);
// imprime novo cabecalho da nota...
RDprint1.imp (01,103,´X´);
RDprint1.impf(01,145,dm.IBNotaCODIGO.text,[expandido,negrito]);
RDprint1.imp (02,40,dm.IBUsuarioENDERECO.text);
RDprint1.imp (03,40,dm.IBUsuarioBAIRRO.text + ´ - ´ + dm.IBUsuarioCIDADE.text + ´ - ´ + dm.IBUsuarioUF.text);
natureza := dm.IBNotaNATUREZA.text;
RDprint1.imp (05,01,natureza);
RDprint1.imp (05,55,dm.IBNotaCFOP.text);
RDprint1.imp (05,110,dm.IBUsuarioINSCRG.text);
// Destinatario / Remetente
RDprint1.imp(08,02,dm.IBNotaNOME.value);
RDprint1.imp(08,110,dm.IBClientesCPFCNPJ.value);
RDprint1.imp(08,148,dm.IBNotaDTEMISSAO.text);
RDprint1.imp(09,02,dm.IBClientesENDERECO.value);
RDprint1.imp(09,83,dm.IBClientesBAIRRO.value);
RDprint1.imp(09,120,dm.IBClientesCEP.value);
RDprint1.imp(09,148,dm.IBNotaDTSAIDA.text);
RDprint1.imp(11,02,dm.IBClientesCIDADE.Value);
RDprint1.imp(11,65,dm.IBClientesFONE.Value);
RDprint1.imp(11,98,dm.IBClientesUF.value);
RDprint1.imp(11,110,dm.IBClientesRGINSC.value);
RDprint1.imp(13,02,dm.IBNotaOBS1.TEXT);
// Itens da Nota Fiscal...
linha := 18; // Linha inicial dos produtos...
dm.IBDetNota.first;
while not dm.IBDetNota.eof do
begin
RDprint1.imp(linha,02,dm.IBDetNotaCODPRODUTO.asstring);
RDprint1.imp(linha,15,dm.IBDetNotaDESCRICAO.value);
RDprint1.imp(linha,79,dm.IBDetNotaLOTE.value);
RDprint1.imp(linha,95,dm.IBDetNotaST.value);
RDprint1.imp(linha,99,DM.IBDetNotaMEDIDA.value);
RDprint1.impval(linha,107,´#0´,DM.IBDetNotaQUANT.value,[]);
RDprint1.impval(linha,123,´,0.00´, DM.IBDetNotaVALORUNITARIO.value,[]);
subtotal := DM.IBDetNotaQUANT.value * DM.IBDetNotaVALORUNITARIO.value;
total := total + subtotal;
RDprint1.impval(linha,145,´#,0.00´, subtotal, []);
RDprint1.imp(linha,156,dm.IBDetNotaICMS.text);
inc(linha);
DM.IBDetNota.next;
end;
RDprint1.impval(43,135,´,0.00´, DM.IBNotaTOTALNOTA.value,[]);
RDprint1.impval(43,02,´,0.00´, DM.IBNotaBASECALCULO.value,[]);
RDprint1.impval(43,30,´,0.00´, DM.IBNotaVALORICMS.value,[]);
RDprint1.impval(45,135,´,0.00´, DM.IBNotaTOTALNOTA.value,[]);
RDprint1.imp(47,96,´1´);
RDprint1.imp(47,105,dm.IBNotaPLACA.TEXT);
RDprint1.imp(57,110,dm.IBNotaDTEMISSAO.TEXT);
RDprint1.imp(58,110,´AA´ + ´ ´ + dm.IBNotaSELO.TEXT);
RDprint1.imp(53,02,´DSP CLIENTE ... ´ + dm.IBClientesDSP.TEXT);
RDprint1.imp(54,02,´DSP LCR ... 24330050009/99 ´);
RDprint1.imp(55,02,dm.IBNotaOBS3.TEXT);
RDprint1.impf(62,143,dm.IBNotaCODIGO.text,[expandido,negrito]);
RDprint1.fechar;
CLOSE;
end;
procedure TFrmNotaFiscal.NOTAClick(Sender: TObject);
var
subtotal, total : currency;
linha : integer;
natureza : String[40];
begin
DM.IBClientes.close;
DM.IBClientes.SelectSQL.Clear;
DM.IBClientes.SelectSQL.add(´SELECT * FROM CLIENTES´);
DM.IBClientes.SelectSQL.ADD(´WHERE CODIGO = ´ + QuotedStr(dm.IBNotaCODCLI.Text) + ´´);
DM.IBClientes.Open;
total := 0;
// Parametros para o NOTA FISCAL...
rdprint1.TamanhoQteLinhas := 66; //66 Linhas (deve ser 1 quando for CUPOM)
rdprint1.TamanhoQteColunas := 96; // Largura da Bobina aprox. 7 cm (7 / 2.54 * 20)
rdprint1.FonteTamanhoPadrao := s20cpp; // Fonte Comprimido em 20 cpp
rdprint1.OpcoesPreview.Preview := FALSE;
RDprint1.PortaComunicacao := FRMPrincipal.EdImpressao.Text;
RDprint1.Abrir;
Inc (linha);
inc (linha);
// imprime novo cabecalho da nota...
RDprint1.imp (01,103,´X´);
RDprint1.impf(01,145,dm.IBNotaCODIGO.text,[expandido,negrito]);
RDprint1.imp (02,40,dm.IBUsuarioENDERECO.text);
RDprint1.imp (03,40,dm.IBUsuarioBAIRRO.text + ´ - ´ + dm.IBUsuarioCIDADE.text + ´ - ´ + dm.IBUsuarioUF.text);
natureza := dm.IBNotaNATUREZA.text;
RDprint1.imp (05,01,natureza);
RDprint1.imp (05,55,dm.IBNotaCFOP.text);
RDprint1.imp (05,110,dm.IBUsuarioINSCRG.text);
// Destinatario / Remetente
RDprint1.imp(08,02,dm.IBNotaNOME.value);
RDprint1.imp(08,110,dm.IBClientesCPFCNPJ.value);
RDprint1.imp(08,148,dm.IBNotaDTEMISSAO.text);
RDprint1.imp(09,02,dm.IBClientesENDERECO.value);
RDprint1.imp(09,83,dm.IBClientesBAIRRO.value);
RDprint1.imp(09,120,dm.IBClientesCEP.value);
RDprint1.imp(09,148,dm.IBNotaDTSAIDA.text);
RDprint1.imp(11,02,dm.IBClientesCIDADE.Value);
RDprint1.imp(11,65,dm.IBClientesFONE.Value);
RDprint1.imp(11,98,dm.IBClientesUF.value);
RDprint1.imp(11,110,dm.IBClientesRGINSC.value);
RDprint1.imp(13,02,dm.IBNotaOBS1.TEXT);
// Itens da Nota Fiscal...
linha := 18; // Linha inicial dos produtos...
dm.IBDetNota.first;
while not dm.IBDetNota.eof do
begin
RDprint1.imp(linha,02,dm.IBDetNotaCODPRODUTO.asstring);
RDprint1.imp(linha,15,dm.IBDetNotaDESCRICAO.value);
RDprint1.imp(linha,79,dm.IBDetNotaLOTE.value);
RDprint1.imp(linha,95,dm.IBDetNotaST.value);
RDprint1.imp(linha,99,DM.IBDetNotaMEDIDA.value);
RDprint1.impval(linha,107,´#0´,DM.IBDetNotaQUANT.value,[]);
RDprint1.impval(linha,123,´,0.00´, DM.IBDetNotaVALORUNITARIO.value,[]);
subtotal := DM.IBDetNotaQUANT.value * DM.IBDetNotaVALORUNITARIO.value;
total := total + subtotal;
RDprint1.impval(linha,145,´#,0.00´, subtotal, []);
RDprint1.imp(linha,156,dm.IBDetNotaICMS.text);
inc(linha);
DM.IBDetNota.next;
end;
RDprint1.impval(43,135,´,0.00´, DM.IBNotaTOTALNOTA.value,[]);
RDprint1.impval(43,02,´,0.00´, DM.IBNotaBASECALCULO.value,[]);
RDprint1.impval(43,30,´,0.00´, DM.IBNotaVALORICMS.value,[]);
RDprint1.impval(45,135,´,0.00´, DM.IBNotaTOTALNOTA.value,[]);
RDprint1.imp(47,96,´1´);
RDprint1.imp(47,105,dm.IBNotaPLACA.TEXT);
RDprint1.imp(57,110,dm.IBNotaDTEMISSAO.TEXT);
RDprint1.imp(58,110,´AA´ + ´ ´ + dm.IBNotaSELO.TEXT);
RDprint1.imp(53,02,´DSP CLIENTE ... ´ + dm.IBClientesDSP.TEXT);
RDprint1.imp(54,02,´DSP LCR ... 24330050009/99 ´);
RDprint1.imp(55,02,dm.IBNotaOBS3.TEXT);
RDprint1.impf(62,143,dm.IBNotaCODIGO.text,[expandido,negrito]);
RDprint1.fechar;
CLOSE;
end;
GOSTEI 0
Cd.wagner.sena
26/07/2007
valeu pessoal as dicas de vcs foram de suma importancia...
GOSTEI 0