 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
tronxx Lt JG


Registrado: 30 May 2003Mensajes: 56Ubicación: Merida, Yucatan, Mexico
|
Publicado: Lun 26 Nov, 2007 10:52 pm Asunto: plantilla pdf o algo para facturas |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 28 Nov, 2007 5:21 pm Asunto: |
|
|
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 |
|
 |
tronxx Lt JG


Registrado: 30 May 2003Mensajes: 56Ubicación: Merida, Yucatan, Mexico
|
Publicado: Jue 27 Dic, 2007 11:18 pm Asunto: Uso de plantillas |
|
|
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 |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Vie 28 Dic, 2007 5:17 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|