Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gilcandido

Imprimir

Recommended Posts

Amigos preciso de ajuda eu fiz este codigo para imprimir direto para impressora via LP1, porém eu não consigo que o campos imprimidos fiquem fiquem fixos em sua coluna, tipo que o campo quantidade fosse imprimido sempre abaixo de QTD do cabeçalho, o que acontece é o campo quantidade em cada produto fica em uma possição devido ao campo descrição.

 

Exemplo:

 

________________________________________________________________________________________

Codigo Descrição QTD Valor Unit Total

________________________________________________________________________________________

479260 Vedador de cabeçote 1 2,00 2,00

6889596 Reparo Bomba Dàgua Volvo B58e 1 80,00 80,00

 

 

Abaixo est o meu codigo, gostaria que me ajudasem, até corrigir alterar ele pra mim para que funcione como citei, pois eu peguei este codigo na net, não o fiz sozinho, pois a verdade que eu não sei como utlizar este tipo de codificação para imprimir direto para porta LPT1, só fiz Até hoje impressão pelo QuickReport, mas eu preciso que este pedido de vendas seja impresso via codificação para dos devido ao acabar de imprimir para onde determino e não imprimi a folha toda, já no quick report eu não sei fazer ele imprimir metade da folha, caso algue´m saiba e seja mais facil aceito a dica também, desde já agradeço a todos pela força, conto com vcs, obrigado.

 

procedure TFrmPedidos.BtnMatricialClick(Sender: TObject);
Var
Impressora:TextFile;
Begin
AssignFile(Impressora,'LPT1:');
Rewrite(Impressora);
Writeln(impressora);

TbTemp_Itens.First;
Writeln (impressora,''+'------------------------------------------------------------------------------');
Writeln (impressora,''+'Codigo' +'    Descricao'+'                              Qtd'+'   Valor Unit.'+'   Total');
Writeln(Impressora);
Writeln (impressora,''+'------------------------------------------------------------------------------');
{ Início do Laço}
While not (TbTemp_Itens.Eof) do
Begin

Writeln(impressora,''+ TbTemp_ItensCodigoPro.Value+''+TbTemp_ItensDescricao.value+''+ FloatToStr(TbTemp_ItensQuantidade.Value)+'      '+FloatToStr(TbTemp_ItensVal_Unit.value)+'      '+FloatToStr(TbTemp_ItensTotal.Value));

TbTemp_Itens.next;
end;


////Pula linhas
Writeln(impressora);
Writeln(impressora);
Writeln(impressora);
Writeln(impressora);
Writeln(impressora);
Writeln(impressora);
Writeln(impressora);
Writeln(impressora,#18);
CloseFile(impressora); 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, uma saída para você seria você montar a string que vai imprimir antes de jogá-la para a impressora com tamanhos fixos para cada campo (criar uma função para isso é interessante)... ai você tem que montar sua linha sempre com os campos vindo na mesma posição, dando espaços para completar ou cortando parte da string para não estourar os limites de caracteres que precisam ser impressos por coluna para manter o alinhamento.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe amigo moderador Chrnos, mas não entendi como eu disse eu não entendo bem destes comandos via impressora, este codigo que postei peguei na net, você poderia por gentilizeza me conceder um exemplo deste codigo, pois eu gostaria de ter o cabeçalho, e baiaxo do cabeçalho que os campos sejam impressos na direção correto, mo meu caso estou temdo o problema no campo descrição, se a descrição tem 20 palavas o quantidade é impressa em um lugar, se a descrição tem trinta palavras ai a quantidade é impressa mais a frente, te pergunto tem como a quantidade ser impressa sempre no mesmo lugar independente do tamanho da descrição impressa?.

 

bom se você puder me passar um exemplo de como seria uma codificçaão que faz o cabeçalho e imprimi os campos do produto corretamente ficarei muito grato, sou mesmo inexperiente para fazer isto, e o pior é que preciso fazer,se puder me ajudar amigo.

 

Para ser mais especifico amigo o que eu estou querendo é imprimir um pedido de vendas, vi um exemplo para nota onde faz o cabeçalho e depois imprimi os itens da nota, mas não deu para adaptar ao que preciso, ficou tudo fora também

ao que você me sugeriu tem como portar um exemplo aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O seu problema não está no comando para a impressora, mas na formatação que está mandando imprimir... por exemplo, qual é o layout de saída do seu arquivo? Você já definiu isso? Digamos que baseado no seu post você tivesse esse layout:

 

CAMPO - TAMANHO DE SAíDA IMPRESSÃO

Codigo  - 20 caracteres
Descricao - 80 caracteres
Qtd - 20 caracteres
Valor Unit. - 20 caracteres
Total - 20 caracteres

Todas as linhas que você fosse mandar para a impressão deveriam obedecer este layout de saída, isto é, se seu código tivesse 5 caracteres para imprimir, você teria que jogar + 15 após ele para que o mesmo continuasse alinhado ao cabeçalho, se a descrição tivesse 90, você teria que suprimir os últimos 10 caracteres, etc... assim você vai conseguir gerar um arquivo alinhado na saída.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

O seu problema não está no comando para a impressora, mas na formatação que está mandando imprimir... por exemplo, qual é o layout de saída do seu arquivo? Você já definiu isso? Digamos que baseado no seu post você tivesse esse layout:

 

CAMPO - TAMANHO DE SAíDA IMPRESSÃO

Codigo  - 20 caracteres
Descricao - 80 caracteres
Qtd - 20 caracteres
Valor Unit. - 20 caracteres
Total - 20 caracteres

Desculpe mais uma vez te incomodar, mas não fiz layout nenhum, nem sabia que tinha que fazer e também não sei fazer

meu campo de codigo é 13 caracteres

descrição = 30

qtd = 3 caracteres

valor unit vai depender do valor da peça seria até 8

total também vai depeder da qtd de peças * valor unit acho que 12.

 

vou te pedir e não sei se você pode fazer, poderia pegar o meu codigo e portar um exemplo correto com ele mais layout que você disse, ou seja pegar o meu codigo e me mostrar como você faraia esta rotina, um exemplo com o codigo completo, como disse sou bem leigo, explicando sobre layout etc. não consigo unir ao meu codigo, pode fazer isto amigo?.

Compartilhar este post


Link para o post
Compartilhar em outros sites

CAMPO - TAMANHO DE SAíDA IMPRESSÃO

 

Codigo - 20 caracteres

Descricao - 80 caracteres

Qtd - 20 caracteres

Valor Unit. - 20 caracteres

Total - 20 caracteres

Todas as linhas que você fosse mandar para a impressão deveriam obedecer este layout de saída, isto é, se seu código tivesse 5 caracteres para imprimir, você teria que jogar + 15 após ele para que o mesmo continuasse alinhado ao cabeçalho, se a descrição tivesse 90, você teria que suprimir os últimos 10 caracteres, etc... assim você vai conseguir gerar um arquivo alinhado na saída.

 

Por Favor Amigo, Como Se faz Este Layout e Aplica ele no meu codigo,me ajude com um exemplo por favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para o seu caso, você poderia montar uma função parecida com esta...

 

Function TForm1.RetornaCampoLayout(sInformacao : String; iTamanhoCampo : Integer) : String;
var i : integer;
begin
     if Length(sInformacao) > iTamanhoCampo then
     begin
        Result := copy(sInformacao, 1, iTamanhoCampo);
        Exit; //Sair da função
    end
    else
    begin
        i := Lenght(sInformacao) + 1;
        while i <= iTamanhoCampo do
        begin
             sInformacao := sInformacao + EmptyStr; //Adicionando espaço em branco após a informação
             inc(i);
        end;
        Result := sInformacao;
    end;
end;

Ai, na hora de passar os dados para a impressora, você poderia montar sua linha de saída usando algo do tipo....

 

Writeln(impressora,
     RetornaCampoLayout(TbTemp_ItensCodigoPro.Value,20) +
     RetornaCampoLayout(TbTemp_ItensDescricao.value,80) +
     RetornaCampoLayout(FloatToStr(TbTemp_ItensQuantidade.Value),20)+
     RetornaCampoLayout(FloatToStr(TbTemp_ItensVal_Unit.value),20)+
     RetornaCampoLayout(FloatToStr(TbTemp_ItensTotal.Value),20));

[]'s

 

Ps.: não testei o código, fiz de cabeça porque no trampo não tenho o delphi na máquina. Portanto, pode precisar de ajustes e posso ter errado alguma sintaxe de comando porque memória falha as vezes hehehe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Montei a função como abaixo do jeito que você sugeriu mas dá um erro, não reconhece Length?

 

Function TForm1.RetornaCampoLayout(sInformacao : String; iTamanhoCampo : Integer) : String;
var i : integer;
begin
 if Length(sInformacao) > iTamanhoCampo then
 begin
 Result := copy(sInformacao, 1, iTamanhoCampo);
 Exit; //Sair da função
 end
 else
 begin
 i := Lenght(sInformacao) + 1; [b]Nesta Linha que da o erro do Lenght, é estranho pois no if tem um length.[/b]
 while i <= iTamanhoCampo do
 begin
 sInformacao := sInformacao + EmptyStr; //Adicionando espaço em branco após a informação
 inc(i);
 end;
 Result := sInformacao;
 end;
end;

você sabe o porque deste erro e como corrigir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

gilcandido, você observou que eu digitei o comando errado na linha em questão? O 'h' veio antes do 't'.

 

Aproveitando, testei o código e tem uma alteração a ser feita... no lugar do EmptyStr, coloque ' ' (aspas simples, espaço, aspa simples).

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

var

S: String;

begin

S := Format('%-15s%-32s%-5s',[TbTemp_ItensCodigoPro.AsString,

TbTemp_ItensDescricao.Value,

TbTemp_ItensQuantidade.AsString]);

S := S + FormatFloat('###,##0.00',TbTemp_ItensVal_Unit.value) + ' ';

S := S + FormatFloat('###,###,##0.00',TbTemp_ItensTotal.Value);

Writeln(impressora,S);

Compartilhar este post


Link para o post
Compartilhar em outros sites


var  S: String;
begin
  S := Format('%-15s%-32s%-5s',[TbTemp_ItensCodigoPro.AsString,
                                TbTemp_ItensDescricao.Value,
                                TbTemp_ItensQuantidade.AsString]);
  S := S + FormatFloat('###,##0.00',TbTemp_ItensVal_Unit.value) + '  ';
  S := S + FormatFloat('###,###,##0.00',TbTemp_ItensTotal.Value);
  Writeln(impressora,S);

Amigo ADilsonD Seu Codigo deu o Alinhameto correto dos campos sempre na possição certa , gostaria de saber se tem como ter um formatação para os preços, é os valores tipo Assim:

1.000,00
  450,00
  110,00
    2,00

Esta imprimindo assim:

1.000,00

450,00

110,00

2,00

Ou seja todos os valores ficam alinhado no inicio do primeiro digito.

 

tem como formatar para ficar alinhado?

se tem pode me passar a dica, agradeço desde de já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

gilcandido, você observou que eu digitei o comando errado na linha em questão? O 'h' veio antes do 't'.

 

Aproveitando, testei o código e tem uma alteração a ser feita... no lugar do EmptyStr, coloque ' ' (aspas simples, espaço, aspa simples).

Chrnos eu olhei, olhei comparei se era erro de digitação, confesso que não condegui ver o erro.

 

Bom Fiz toda a Alteração que você pediu, mas esta imprimido assim:

 

479260VEDADOR DE CABECOTE122 / para todos os produtos

 

Mesmo que mude o valor final do codigo imprimi do mesmo jeto /

RetornaCampoLayout(TbTemp_ItensDescricao.value,80) + mesmo que eu mude este valor de 80 para 90 não adianta

e como poder ver valor da peça esta com um digito onde esta 22 um dois é valor unit. e o outro valor total

pode me ajudar mais uma vez?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você trocou o EmptyStr por ' ' (aspas simples + espaço em branco + aspa simples) como eu falei para mudar na função?? Eu tinha esquecido que o EmptyStr não serve para jogar um espaço em branco numa string mas sim para inicializá-la sem nada... mudando isso você já deve ter um retorno com os espaços a direita da string que enviou para a função...

 

Outra coisa... você pode combinar a rotina que montei com o código que o AdilsonD criou, para formatar seus dados... e poderia usar alguma flag nova para indicar se o espaço fica a esquerda ou a direita para preencher com o espaço em branco... pense um pouco, estude os códigos que já tem na mão que vai conseguir montar....

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pediu pra mudar neste codigo abaixo.

 

sInformacao := sInformacao + EmptyStr;

 

Fiz Assim, mas continua imprimindo tudo grudado como te disse.

onde eu estou errando?

 

 

sInformacao := sInformacao+'' +'';

 

Peço desculpa por te incomodar tanto, mas estou apanhando feio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu disse antes, coloque sInformacao := sInformacao + aspa simples + espaço em branco + aspa simples, ou seja:

 

sInformacao := sInformacao +' ';

E pra passar formatando os campos, você pode chamar a procedure fazendo algo do gênero para cada campo....

 

RetornaCampoLayout(FormatFloat('###,##0.00',TbTemp_ItensVal_Unit.value), 20)

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

var
  S: String;
begin
  S := Format('%-15s%-32s%-5s',[TbTemp_ItensCodigoPro.AsString,
                                TbTemp_ItensDescricao.Value,
                                TbTemp_ItensQuantidade.AsString]);
  S := S + FormatFloat('###,##0.00',TbTemp_ItensVal_Unit.value) + '  ';
  S := S + FormatFloat('###,###,##0.00',TbTemp_ItensTotal.Value);
  Writeln(impressora,S);

Altere para:

var
  S: String;
begin
  S := Format('%-15s%-32s%-5s%10s%15s',[TbTemp_ItensCodigoPro.AsString,
                                        TbTemp_ItensDescricao.Value,
                                        TbTemp_ItensQuantidade.AsString,
                                        FormatFloat('###,##0.00',TbTemp_ItensVal_Unit.value),
                                        FormatFloat('###,###,##0.00',TbTemp_ItensTotal.Value)]);
  Writeln(impressora,S);

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.