Ir al contenido


Foto

PROGRAMACION MAESTRO DETALLE


  • Por favor identifícate para responder
21 respuestas en este tema

#1 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 23 enero 2012 - 07:33

Hola a Todos, soy nuevo en Delphi y estoy tratando de hacer un programa para Calculo de Analisis de Precios Unitarios, con Delphi 7 con una Bases de Datos Access, usando ADOTconection, ADOQuery, ADOTable, DataSource y Dbgrid, ya tengo las rutinas para la carga de las tablas Maestras de Materiales, Equipos, Mano de Obra y sus respectivas Familias, Gracias a la Ayuda del Buen Amigo Caral, el problema que tengo, es al momento de Crear las partidas, pues para ello necesito, usar las tablas de: Paridas, y las tablas de detalle de Materiales, Equipos y Mano de Obra de la Partida, en resumen tengo estas tablas...
1._Maestro de Materiales, Equipos y Mano de Obra
2._Famila de Materiales, Equipos y Mano de Obra
3._ Maestro de Partidas
4._ Detalle de Materiales, Equipos, Mano de Obra (Para mostrar el detalle de las Partidas)

Tengo algo adelantada la carga de Partidas, y cuando me ubico en una de ellas, me muestra los insumos  asociados, (Materiales, Equipos y Mano de Obra), pero como son tablas de detalles no contienen la descripción del ítem, el costo o el salario, esos datos están en las tablas maestras de materiales, equipos y mano de obra,como hago para que:
1._ Esos datos aparezcan alli sin tener redundancia de informacion.
2._Totalizar tanto en cada ítem como en cada columna.

Luego de lograr esto, es necesario que cuando haga doble click en la partida me permita modificar la misma y cuando le de doble click en cualquier insumo me muestre una pantalla con dichos insumos y los insumos de la tabla maestra para poder utilizarlos.
En la Imagen Anexa muestro El Form donde tengo la informacion:

Imagen Enviada


Para Aportar algo les dejo un codigo que permite mostrar un campo memo en un dbgrid:
Solo hay que colocar en el evento OnGetText del campo Memo del ADOTable correspondiente, el siguiente Codigo:



delphi
  1. procedure TForm_Partidas.ADOTable1DESC_PARTGetText(Sender: TField;
  2. var Text: String; DisplayText: Boolean);
  3. begin
  4.       Text := Copy(ADOTable1DESC_PART.AsString, 1, 50);
  5. end;

Archivos adjuntos


  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 23 enero 2012 - 08:04

Hola
He modificado el post del amigo JUANJMOYAR para colocar la foto visible ademas de poner el código completo de su programa, la base de datos y un archivo word donde explica lo que necesita hacer.
Os agradeciria que ayudarais, yo no he podido correr el programa por que me genera algunos errores que no logro resolver. (y)
Saludos

  • 0

#3 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 24 enero 2012 - 09:26

Hola
A ver jóvenes, quien ayuda ? (y) *-)
Saludos
  • 0

#4 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 24 enero 2012 - 10:28

¿Y que falta?, por lo que entiendo son un par de consultas y modificaciones, que si no se pueden hacer directo con un query bastará.


Saludos!
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 24 enero 2012 - 11:11

Hola
A ver jóvenes, quien ayuda ? (y) *-)
Saludos


Estoy intentando correr la aplicación y me da este error.

[DCC Fatal Error] TITAN.dpr(18): F2063 Could not compile used unit '..\ICONOS\UData.pas'.

Falta el archivo UData.pas

Revisa las fuentes y cárgalo de nuevo de nuevo, que con mucho gusto te ayudaremos.

Saludos
  • 0

#6 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 24 enero 2012 - 06:54

Hola
Aqui pongo el archivo udata.pas que falta.
Gracias por la ayuda.
Saludos

Archivos adjuntos


  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 24 enero 2012 - 10:41

A ver amigo, lo que tu pides da para un poco de hilos, de todas formas voy a tratar de ayudarte, tu dices:

En el Inicio del Programa, si cierro esta ventana, en la X, el programa se bloquea, como hago que al tomar esta opción se cierre por completo la aplicación.


Para solucionar esta parte sigue esta guía:

En el Form_Login haz los siguientes cambios:

1. Elimina el ADLogin.  mas adelante te explico porqué.

2. Al BtnOk  cámbiale su propiedad ModalResult a mrNone.

3. Quita los eventos OnClick de los botones btnOk y btnCancel.

4. Copia y remplaza el código de la unit CONTROL_ACCESO como lo pongo enseguida, después asigna el evento OnClick al btnOk para que coincida con el nuevo código.

5. Cambia la propiedad visible del Form a False.



delphi
  1. unit CONTROL_ACCESO;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs,  jpeg, ExtCtrls, StdCtrls, Buttons;
  8.  
  9. type
  10.   TForm_Login = class(TForm)
  11.     Label2: TLabel;
  12.     EUsuario: TEdit;
  13.     EClave: TEdit;
  14.     BtnOk: TBitBtn;
  15.     BtnCancel: TBitBtn;
  16.     Label1: TLabel;
  17.     Image2: TImage;
  18.     Image1: TImage;
  19.     procedure BtnOkClick(Sender: TObject);
  20.  
  21.   private
  22.     { Private declarations }
  23.   public
  24.     class function Execute: Boolean;
  25.   end;
  26.  
  27. implementation
  28.  
  29. Uses UData;
  30. {$R *.dfm}
  31.  
  32. procedure TForm_Login.BtnOkClick(Sender: TObject);
  33. begin
  34.   if DataModule1.UsuarioValido(EUsuario.Text, EClave.Text) then
  35.     ModalResult := mrOK
  36.   else
  37.     ShowMessage('Sus datos son incorrectos.')
  38. end;
  39.  
  40. class function TForm_Login.Execute: Boolean;
  41. begin
  42.   with TForm_Login.Create(nil) do
  43.     try
  44.       Result := ShowModal = mrOK;
  45.     finally
  46.       Free;
  47.     end;
  48. end;
  49.  
  50. end.



Notarás que he agregado una función de clase que se encarga de gestionar el control de acceso, he eliminado la variable CUENTA pues no le encuentro sentido contar los intentos si de todas formas al cerrar el form puede intentarlo cuantas veces quiera, la variable Nombre la he pasado al DataModule1, como veremos más adelante. El btnOk pasa los parámetros a la función UsuarioValido que está en DataModule1.

En DataModule1 haz lo siguiente:

1. Agrega un AdoQuery y ponle  el nombre qLogin y en su propiedad SLQ ponle:

SELECT NOMBRE, CLAVE FROM TITAN_USUAR WHERE (NOMBRE = :NOM) AND (CLAVE = :CLAV)


2. Crea los campos persistentes en QLogin, haciendo doble click sobre el componente y dale agregar todos los campos.

3. Copia y remplaza el código de UData con el código que te pongo en seguida, y haz que coincidan los eventos DataModuleCreate y DataModule Destroy con el nuevo código.



delphi
  1. unit UData;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, Classes, DB, ADODB, IniFiles,Forms, Dialogs;
  7.  
  8. type
  9.   TDataModule1 = class(TDataModule)
  10.     ADOConnection1: TADOConnection;
  11.     qLogin: TADOQuery;
  12.     qLoginNombre: TWideStringField;
  13.     qLoginClave: TWideStringField;
  14.     procedure DataModuleCreate(Sender: TObject);
  15.     procedure DataModuleDestroy(Sender: TObject);
  16.   private
  17.     { Private declarations }
  18.   public
  19.     function UsuarioValido(ANombre, AClave: string): Boolean;
  20.     { Public declarations }
  21.   end;
  22.  
  23. var
  24.   DataModule1: TDataModule1;
  25.   NombreGlobal: String;
  26.  
  27. implementation
  28.  
  29. {$R *.dfm}
  30.  
  31. procedure TDataModule1.DataModuleCreate(Sender: TObject);
  32. var
  33.   BaseDeDatos, ConStr: String;
  34.   IniFile: TIniFile;
  35. begin
  36.   // Obtiene la ruta y el nombre de la base de datos
  37.   IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'BD.ini');
  38.   try
  39.     BaseDeDatos := IniFile.ReadString('BD', 'Path', '');
  40.     If BaseDeDatos = '' then
  41.       raise Exception.Create('Error al cargar Base de Datos');
  42.     ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=' +
  43.       BaseDeDatos + ';' + 'Persist Security Info=False;' +
  44.       'Jet OLEDB:Database Password=Admin';
  45.     ADOConnection1.ConnectionString := ConStr;
  46.     ADOConnection1.Open;
  47.   finally
  48.     IniFile.Free
  49.   end;
  50.  
  51. end;
  52.  
  53. procedure TDataModule1.DataModuleDestroy(Sender: TObject);
  54. begin
  55.   ADOConnection1.Close;
  56. end;
  57.  
  58. function TDataModule1.UsuarioValido(ANombre, AClave: string): Boolean;
  59. begin
  60.   Result := False;
  61.   qLogin.Close;
  62.   qLogin.Parameters[0].Value := ANombre;
  63.   qLogin.Parameters[1].Value := AClave;
  64.   try
  65.     qLogin.Open;
  66.     Result := not qLogin.IsEmpty;
  67.     if Result then
  68.       NombreGlobal := qLoginNombre.AsString;
  69.   finally
  70.     qLogin.Close;
  71.   end;
  72. end;
  73.  
  74. end.



Notarás que he agregado la función UsuarioValido que recibe los parámetros de nombre y clave de usuario, abre el query y devuelve True si el usuario existe, si es así entonces guarda el nombre del usuario en la variable NombreGlobal que posteriormente puedes usar desde cualquier parte de tu programa, por ejemplo pasar ese nombre al statusbar del form principal.

Finalmente los cambios son en el DPR de la aplicación, haz click en Procject > ViewSource y remplaza el código con el siguiente:



delphi
  1. program TITAN;
  2.  
  3. uses
  4.   Forms,
  5.   UData in '..\ICONOS\UData.pas' { DataModule1: TDataModule } ,
  6.   TITAN_MAIN in 'TITAN_MAIN.pas' { Form_Menu } ,
  7.   CONTROL_ACCESO in 'CONTROL_ACCESO.pas' { Form_Login } ,
  8.   F_MATERIALES in 'F_MATERIALES.pas' { Form_FMateriales } ,
  9.   F_EQUIPOS in 'F_EQUIPOS.pas' { Form_FEquipos } ,
  10.   F_MANO in 'F_MANO.pas' { Form_FMano } ,
  11.   F_UMEDIDAS in 'F_UMEDIDAS.pas' { Form_Unidades } ,
  12.   M_MATERIALES in 'M_MATERIALES.pas' { Form_Materiales } ,
  13.   M_EQUIPOS in 'M_EQUIPOS.pas' { Form_Equipos } ,
  14.   M_MANO in 'M_MANO.pas' { Form_ManoObra } ,
  15.   M_PROVEEDORES in 'M_PROVEEDORES.pas' { Form_MProveedores } ,
  16.   M_USUARIOS in 'M_USUARIOS.pas' { Form_Usuarios } ,
  17.   T_EQUIPOS in 'T_EQUIPOS.pas' { Form_Tequipos } ,
  18.   M_PARTIDAS in 'M_PARTIDAS.pas' { Form_Partidas } ;
  19. {$R *.res}
  20.  
  21. begin
  22.   Application.Title := 'TITAN';
  23.   Application.CreateForm(TDataModule1, DataModule1);
  24.   if TForm_Login.Execute then
  25.   begin
  26.     Application.Initialize;
  27.     Application.CreateForm(TForm_Menu, Form_Menu);
  28.     Application.Run;
  29.   end
  30.   else
  31.   begin
  32.     DataModule1.Destroy;
  33.     Application.Terminate;
  34.   end;
  35.  
  36. end.



Notarás que el MainForm solo se crea y la aplicación arranca si la función execute del FormLogin devuelve true, de lo contrario, destruimos el datamodule1 y terminamos la aplicación.

Bueno amigo con esto tienes un acceso limpio a tu aplicación, yo lo probé y funciona bien, con  tus otras necesidades te puedo colaborar en cuanto tenga un tiempo.

Te adjunto el FormLogin y el Datamodule modificados, los hice en Delphi 2010 y te podrían dar algún problema menor, por ese motivo copié el código en este post.

Saludos

PD : Después de hacer estos cambios el programa arrancará normalmente, pero si intentas abrir los otros forms te dará un access Violation porque lo que estabas haciendo es incorrecto, esto se subsana así: Por ejemplo para crear el Form Partidas desde el MainForm:



delphi
  1. procedure TForm_Menu.partidas1Click(Sender: TObject);
  2. begin
  3.   with TForm_Partidas.Create(Application) do
  4.     Show;
  5. end;



Y luego en el evento OnClose del Form Partidas para liberarlo colocamos lo siguiente:


delphi
  1. procedure TForm_Partidas.FormClose(Sender: TObject; var Action: TCloseAction);
  2. begin
  3.   Action := caFree;
  4. end;



Hay que hacer lo mismo con los otros forms.
  • 0

#8 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 31 enero 2012 - 07:17

Hola a todos, gracias por su ayuda, no habia podido revisar el tema, pues mi conexion a internet estaba dañada  8o|, ya me pongo a relizar las correciones, a ver como me va... ;), gracias de verdad!
  • 0

#9 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 31 enero 2012 - 11:44

Hola Wilson, Ya puse las correcciones como me dijiste, pero me aparece un mensaje cuando ejecuto con lo suguiente:
Proyect TITAN.exe raise exception class EOLeSysError with message 'No se ha llamado a CoInitialize'. Process Stoped or Use Step or Run Continue
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 31 enero 2012 - 11:56

Hola Wilson, Ya puse las correcciones como me dijiste, pero me aparece un mensaje cuando ejecuto con lo suguiente:
Proyect TITAN.exe raise exception class EOLeSysError with message 'No se ha llamado a CoInitialize'. Process Stoped or Use Step or Run Continue


Bueno, pues habrá que hacer el llamado a la función, 



delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   Coinitialize(nil);
  4. end;



Ésta función requiere que agregues la unidad ActiveX en la sección de Uses.

Saludos

  • 0

#11 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 01 febrero 2012 - 06:45

Hola Wilson, Ya puse las correcciones como me dijiste, pero me aparece un mensaje cuando ejecuto con lo suguiente:
Proyect TITAN.exe raise exception class EOLeSysError with message 'No se ha llamado a CoInitialize'. Process Stoped or Use Step or Run Continue


Yo hice pruebas en Delphi 2010 y no me da ningún problema, dame un tiempo prudencial yo instalo en una máquina virtual Delphi 7 para poder ayudarte bien en forma.

Saludos
  • 0

#12 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 01 febrero 2012 - 11:20

Si, efectivamente, me funciona cuando lo compilo en delphi 2010 el, pero en delphi 7, no lo hace, aparece el error que te dije, gracias!

Si prefieres seguimos haciendo los cambios en delphi 2010 y asi me cambio y aprendo algo mas actualizado...

P.D. para el Control de Acceso seria deseable dejar en el fondo TITAN_MAIN (Menu Principal) inactivo, hasta que se compruebe el usuario y la clave...
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 01 febrero 2012 - 11:49

Si, efectivamente, me funciona cuando lo compilo en delphi 2010 el, pero en delphi 7, no lo hace, aparece el error que te dije, gracias!

Si prefieres seguimos haciendo los cambios en delphi 2010 y asi me cambio y aprendo algo mas actualizado...

P.D. para el Control de Acceso seria deseable dejar en el fondo TITAN_MAIN (Menu Principal) inactivo, hasta que se compruebe el usuario y la clave...


¿ Ya probaste con mi sugerencia ?

Saludos
  • 0

#14 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 01 febrero 2012 - 12:20

Hola, Gracias,

Si probe tu sugerencia y cuando ejecuto, me aperece lo siguiente:

Exception EOLeSysError in Module TITAN.exe at 0006cb35 No se a llamado a CoInitialize.
  • 0

#15 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 06 febrero 2012 - 11:17

Hola,  ya aplique los cambios sugeridos por Wilson, y me funcionan muy bien,  (y), solo que en delphi 2010, en delphi 7, me seguia dando el error, bueno pero como dije antes, creo que lo mejor es seguir programando en algo mas actualizado, para el Control de Acceso seria deseable dejar en el fondo TITAN_MAIN (Menu Principal) inactivo, hasta que se compruebe el usuario y la clave...
Pero lo que mas me hace falta es poder modificar los items asociados a la pertida, ademas de colocar campos como la descripcion y los precios o salarios correspondientes que estan en las tablas maestras y no en las detalle...
  • 0

#16 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 23 febrero 2012 - 11:28

Hola, compañeros, ya de vuelta!, he estado resolviendo los detalles en el programa, gracias a todos por su aporte, solo me falta. como hacer:
1._ colocar los datos faltantes en materiales, equipos y mano de obra, sin redundar los datos.
2.- totalizar items y columnas
eso por el momento, despues podemos ver el resto, agradeceria su ayuda, he intentado algunas cosas y no he logrado hacerlo, gracias de antemano, como siempre!
  • 0

#17 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 02 marzo 2012 - 08:42

:)  *-) Hola Amigos, a ver quien puede ayudarme, he estado trabajando en los problemas de mi programa, ya logre mostrar una consulta del dbgrid dandole doble click a un registro, me funciona bien, tambien puedo pasar uno o varios registros de un dbgrid a otro, por el momento solo necesito de su ayuda para hacer que en los dbgrid detalle aparesca la descripcion y el costo de cada item de materiales, equipos y mano de obra, necesito traerlos y mostrarlos en el detalle pero sin que se graben para no redundar los datos, ya que estos estan en las tablas maestras, ademas necesito totalizar cada item y las columnas, gracias de antemano, como siempre!
  • 0

#18 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 02 marzo 2012 - 10:44

Quizá este hilo  te de una idea.

Saludos
  • 0

#19 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 28 marzo 2012 - 03:31

Hola amigos tengo una duda y necesito de su ayuda, por favor,
Estoy tratando de colocar campos de dos tablas en un dbgrid, pero no me funciona...
Tengo un ADOQuery, un ADOTconnection, un DATAsource y un DBgrid,
en la propiedad SQL de ADOQuery coloco:

SELECT *  FROM TITAN_MATE  INNER JOIN TITAN_PMATE ON TITAN_MATE.COD_MAT =  TITAN_PMATE.COD_INS

Conecto el DBgrid con un DATAsource, este a el ADOQuery este otro con el ADOTconnection,
muestra las cabeceras en el DBGrid pero no los registros, ademas en el evento oncreate del form hago un open al ADOQuery, pero nada, solo las cabeceras, ademas me pidio un parametro en el ADOQuery cuando puse los datos en la propiedad SQL con esto: TITAN_PMATE.COD.INS Y EN VALUE LE PUSE COD_MAT(DE TITAN_MATE), lo que quiero es mostrar en el DBgrid el Codigo, Cantidad y Desperdico (que pertenecen a TITAN_PMATE) y Descripcion y Costo (que pertenecen a TITAN_MATE), les agrdeceria muchisimo si me pudieran ayudar, ya que estoy frenado aqui, ya revise unos post y estube haciendo pruebas, pero no he logrado nada aun.
Nota: Adjunto el programa como para revisar.
Gracias de antemano, por todo!
  • 0

#20 JUANJMOYAR

JUANJMOYAR

    Member

  • Miembros
  • PipPip
  • 14 mensajes
  • LocationMaturin, Monagas

Escrito 28 marzo 2012 - 03:36

perdon, no se adjunto el archivo, no ce que paso, si alguien sabe como hacerlo, por favor me avisan, por el momemto ahi esta la explicacion del problema...

Muchas Gracias de Verdad!
  • 0




IP.Board spam blocked by CleanTalk.