Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

plantilla pdf o algo para facturas

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: plantilla pdf o algo para facturas Responder citando

Hola amigos, estoy desarrollando un programa de facturacion, pues esta bien ( creo, je je je ) el detalle es que hasta ahora y usando el QuickReport o escribiendo directamente el codigo en EscP2 para las impresoras de matriz de puntos pues va bien, pero necesito que se lea una plantilla y rellenarla pues este programa quiero comercializarlo y no se como hacer lo de la plantilla, alguien me puede dar una idea de como hacerlo ? hasta ahora tengo una idea mas o menos asi ( en un archivo .ini )

Encabezado:
Linea, columna, dato, largo dato
1 centrado Nombre Empresa, *
2 , 10 Codigo Cliente, 10
2 , 21 Nombre Cliente, 50
2, 75 Fecha Factura, 10
5 renglones --> En la linea 5 comienzan los renglones

renglones:
columna, dato, longitud
0, codigo_articulo, 13
34 Descripcion, 30
65 Cantidad 10
76 Precio Unit. 12
89 Importe 12

Pie:
Comienza en linea 25
25, 1 Importe en letras
26, 89 Importe
27, 89 Iva
28, 89 Total
30 - 33 Obsrvaciones y leyendas

Alguien tiene alguna idea de como hacer esto ? para que solo se tenga que cambiar un archivo y no haya que reconfigurar el programa ni nada ?

Gracias
_________________
La caja decía, requiere Win95 o superior así que instalé Linux.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Llevo un par de días dándole vueltas a tu pregunta. Sólo se me ocurre una solución para controlar las líneas que imprimes:
    1. Define un contador en el include del formulario
    Código:
    //---------------------------------------------------------------------------

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes>
    #include <Controls>
    #include <StdCtrls>
    #include <Forms>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:   // IDE-managed Components
         TQuickRep *QuickRep1;
    private:   // User declarations
    public:      // User declarations
         __fastcall TForm1(TComponent* Owner);
         int LineaImpresa;
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

    2. En el BeforPrint de la cabecera inicializas el contador:
    Código:
    void __fastcall TForm1::CabeceraDeColumnaBeforePrint(TQRCustomBand *Sender, bool &PrintBand)
    {
         LineaImpresa = 0;
    }
    //---------------------------------------------------------------------------

    3. En BeforePrint de la banda de detalle incrementas el contador:
    Código:
    void __fastcall TForm1::LineaDetalleBeforePrint(TQRCustomBand *Sender, bool &PrintBand)
    {
         LineaImpresa ++;
    }
    //---------------------------------------------------------------------------

    4. En el AfterPrint de esta banda compruebas el número de línea. SI es mayor que el que te interesa, fuerzas el salto de página:
    Código:
    void __fastcall TForm1::LineaDetalleAfterPrint(TQRCustomBand *Sender, bool BandPrinted)
    {
         if (LineaImpresa >= 25)
              LineaDetalle->ForceNewPage();
    }
    //---------------------------------------------------------------------------

No lo he probado, pero algo similar tengo hecho. No sé si esto es parecido a lo que pedías
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Uso de plantillas Responder citando

Muy buena tu idea, pero hay un problem, el problem es que cada usuario tiene una idea diferente de como quiere ver su factura y no quiero estar haciendo modificaciones al programa, si se pudiera hacer una especie de formulario que el usuario final pueda modificar para que se guarde su plantilla, me explico ?
Gracias
_________________
La caja decía, requiere Win95 o superior así que instalé Linux.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola, hay un compo de la paleta ClubBuilder que te permite diseñar en tiempo de ejecucion un formato de impresion de forma sililar al QuickRep

1.- Bajalo aqui: http://delpino.com.ve/tmp/clubbuilder.rar

2.- Descomprimelo en cualquier carpeta ej Projects.

3.- En el Builder Open Project / ClubBuilder.bpk

4.- Compile y luego install.

5.- En el form o datamodule donde tengas las tablas o querys de tu aplicacion coloca un TBCPP, en la propiedad StoreFile coloca la ruta y nombre del archivo donde se guardara la plantilla.

Código:
//Para Configurar La impresion
void __fastcall TfFacturas::Configurar1Click2(TObject *Sender)
{
try{CBPP1->LoadFromFile();}catch(...){}//trata de cargar fichero

CBPP1->CastDataSets();//lee las tablas existentes en la Unit

CBPP1->ShowModal();//Abre la configuracion
CBPP1->SaveToFile();

}


En la parte superior hay botones que corresponden a etiquetas, dbtext, bandas etc con el QuickRep, similar al builder click en uno y click donde quieras ponerlo, click derecho para eliminarlo y propiedades.
Código:
//imprimir directo
CBPP1->Print();

Código:
//vista previa
CBPP1->PreviewModal(); o CBPP1->Previewl();

Código:
//Abrir formato existente
OpenDialog1->InitialDir=ExtractFilePath(Application->ExeName)+"Formatos";
if(OpenDialog1->Execute())
{
 CBPP1->StoreFile=OpenDialog1->FileName;
 CBPP1->LoadFromFile();
}


Otra Forma es utilizar Word como plantilla y motor de impresion, este codigo lo obtuve de este foro y lo modifique a mi necesidad.

Este codigo reemplaza todas las ocurrencias de {{Nombre de Campo}} que encuentre en el documento de word, aclaro que la plantilla diseñada en word la extraigo de un campo blob en una tabla asi que tocara hacer algun cambio para utilizar un fichero del disco
Código:
void __fastcall TfFormulario::PrintWord(bool Exportar)
{
Variant vWord, vDocumentos, vDocumento, vSeleccion, vBuscar;
String sPath = ExtractFilePath(Application->ExeName);
try
{
 //Borrar Temporales
  DeleteFile(ExtractFilePath(Application->ExeName)+"\\Print.doc");

  static_cast<TBlobField>
  (Query->FieldByName("Contenido"))->SaveToFile(sPath+"Print.doc");
    //Abrir Word

    String sFicheroPlantilla = sPath+"Print.doc";
    //String sFicheroGenerado  = sPath + "Print.doc";

    //--- Abre Word
    vWord = CreateOleObject( "Word.Application" );//;GetActiveOleObject( "Word.Application" )
    vWord.OlePropertySet( "Visible", false );

    //--- Abre el documento que usaremos como plantilla
    vDocumentos = vWord.OlePropertyGet( "Documents" );
    vDocumento = vDocumentos.OleFunction( "Open",
        sFicheroPlantilla.c_str(),  // Documento
        false,                      // Confirmar conversiones
        false,                       // Modo de solo lectura
        false,                      // Añadir al menu de ficheros recientes
        ""                          // Clave del documento
        );

    //--- Selecciona todo el documento para reemplazar
    vSeleccion = vWord.OlePropertyGet( "Selection" );
    vSeleccion.OlePropertyGet( "Range" ).OleProcedure( "SetRange", 0, 0 );
    vBuscar = vSeleccion.OlePropertyGet( "Find" );
    vBuscar.OleProcedure( "ClearFormatting" );
    vBuscar.OlePropertyGet( "Replacement" ).OleProcedure( "ClearFormatting" );
   // WordApplication1->Selection->Text


   for(int i=0;i<tbDocumentos>FieldCount;i++)
   {
    TField *Campo=(TField*)tbDocumentos->Fields->Fields[i];
    if(i>4)//no imprime campos de control
     {
        vBuscar.Exec( Procedure( "Execute" )
        <<Campo>FieldName+"}}"// Texto a buscar
        << VT_EMPTY                   // Coincidir mayusculas y minusculas
        << VT_EMPTY                   // Solo palabras completas
        << VT_EMPTY                   // Usar caracteres comodin
        << VT_EMPTY                   // Suena como
        << VT_EMPTY                   // Todas las formas de la palabra
        << true                       // Hacia adelante
        << VT_EMPTY                   // Wrap
        << VT_EMPTY                   // Format
        <<Campo>AsString.c_str()              // Reemplazar con...
        <<2>Execute())
       CopyFile(sPath+"Print.doc",SaveDialog1->FileName);
      //Borrar Archivo
      Sleep(5000);
      DeleteFile(sPath+"Print.doc");
}
}
//------------------------------------------------------------------------------------------------------------------------------------------
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.