Ir al contenido



Foto

Problemas con Firedac y mysql


Mejor respuesta JoAnCa , 29 septiembre 2018 - 11:09

Pues parece que ya se soluciono el problema

Lo que hice fue:
- Inclui en la vista las 2 llaves de la relacion (pues tenia solo la del lado muchos)
- Asigne la llave en la propiedad UpdateOptions.KeyFields

Despues de estos arreglos, probe calculando varias veces en cada area, y no me ha dado mas el error Ir al mensaje completo


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

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationPinar del Río, Cuba

Escrito 28 septiembre 2018 - 09:25

Hola a todos
Tengo una aplicación que debe calcular los datos de una prenomina, basandose en otros campos de otras tablas.
Pero en algunos casos me da el error q muestro en la imagen adjunta

La logica del formulario es:
- Seleccionar el area de trabajo y se filtran los datagrid (2 datagrid)
- Clic en boton Calcular y hace los cálculos de las prenominas de cada datagrid

Depurando veo que el error lo da cuando hago el post para guardar el registro

Que podra estar pasando?

El error sale solo en un area, al guardar determinado trabajador, en las otras hace los calulos bien.

Pensando en problemas con ese trabajador, lo elimino, y el error lo da en otro cualquiera


Los datagrid los baso en una consulta de mysql, que es editable

Archivos adjuntos


Editado por JoAnCa, 28 septiembre 2018 - 09:27 .

  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.394 mensajes
  • LocationRepública Dominicana

Escrito 28 septiembre 2018 - 10:17

Puede ser que las tablas donde se haga un update no tiene clave primaria.


  • 0

#3 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationPinar del Río, Cuba

Escrito 28 septiembre 2018 - 10:21

Puede ser que las tablas donde se haga un update no tiene clave primaria.


Pues si tiene clave primaria, incluso a la consulta tambien se la paso
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.394 mensajes
  • LocationRepública Dominicana

Escrito 28 septiembre 2018 - 10:26

El error lo dice claro, un poco de código tal vez pueda ser de ayuda.


  • 0

#5 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationPinar del Río, Cuba

Escrito 28 septiembre 2018 - 11:17

Quizas la logica que uso no sea la mas adecuada, por lo que cualquier sugerencia para cambiarla sera aceptada.

El problema es que tengo una tabla prenominas, pero al calcular tengo que dividirla en dos, los miembros de la direccion y los consultores.
Entonces hago dos consultas basadas en prenomina, una para la direccion del area y otra para los consultores de esa area, y los muestro en sus datagrid respectivos.

Al calcular, las formulas de los 2 casos son diferentes, pero la cantidad de salario a distribuir es comun para los dos.

En una ocasion el error me lo dio en la consulta de la direccion de la 2da area, vacie la tabla y despues me lo da en la consulta de los consultores en la 6ta area.

Es decir, que da el error arbitrariamente ??

Este es el codigo que uso en el boton Calcular



delphi
  1. with ModuloBD do
  2. begin
  3. //--- Direccion del Grupo de Trabajo ---
  4. TDeveng:=0; TAjust:=0; TPenal:=0;
  5. fdtPrenomGTDir.First;
  6. fdtPrenomGTDir.DisableControls;
  7. while not fdtPrenomGTDir.Eof do
  8. begin
  9. fdtPrenomGTDir.Edit;
  10. fdtPrenomGTDirSalarioNeto.Value:=fdtPrenomGTDirSalarioAjust.Value + fdtPrenomGTDirEstimAdic.Value;
  11. fdtPrenomGTDirEstimulac.Value:=fdtPrenomGTDirSalarioNeto.Value - fdtPrenomGTDirSalarioDeveng.Value;
  12. // Calcular el formado
  13. if fdtPrenomGTDirIngresos.Value > 0 then
  14. SalForm:=fdtPrenomGTDirIngresos.Value * fdtAuxiliarCDSEspPrinc.Value
  15. else
  16. begin
  17. //--- Si es el Esp. Princiapal ---
  18. if fdtPrenomGTDirIDSUBCAT.Value = 7 then
  19. if frmSisleg.CantTrabGT > 0 then SalForm:=(fdtIngxGruposMontoADist.Value / frmSisleg.CantTrabGT) * fdtPrenomGTDirSalarioDeveng.Value / fdtPrenomGTDirSalarioBasico.Value
  20. else SalForm:=0
  21. //--- Si es la Contadora
  22. else
  23. if frmSisleg.CantTrabGT > 0 then SalForm:=(fdtIngxGruposMontoADist.Value / frmSisleg.CantTrabGT) * fdtPrenomGTDirSalarioDeveng.Value / fdtPrenomGTDirSalarioBasico.Value * 50 / 100
  24. else SalForm:=0
  25. end;
  26. fdtPrenomGTDirSalarioFormado.Value:=SalForm;
  27. fdtPrenomGTDir.Post;
  28. //--- Totalizar ---
  29. TAjust:=TAjust + fdtPrenomGTDirSalarioAjust.Value;
  30. TPenal:=TPenal + fdtPrenomGTDirPenalizacion.Value;
  31. fdtPrenomGTDir.Next;
  32. end;
  33. fdtPrenomGTDir.First; fdtPrenomGTDir.Refresh;
  34. fdtPrenomGTDir.EnableControls;
  35. qryTotPrenomGTDir.Refresh;
  36. TDeveng:=dbtxtTotSalEsc.Field.Value + dbtxtTotDFer.Field.Value + dbtxtTotOtrosP.Field.Value;
  37. lblDevengDG.Caption:=FloatToStrF(TDeveng, ffNumber, 6, 2);
  38. lblSalAjustDG.Caption:=FloatToStrF(TAjust, ffNumber, 6, 2);
  39. lblTotPenalDG.Caption:=FloatToStrF(TPenal, ffNumber, 6, 2);
  40.  
  41. //--- Consultores ---
  42. fdtPrenomGTCons.Refresh;
  43. TDeveng:=0; TAjust:=0; TPenal:=0;
  44. fdtPrenomGTCons.DisableControls;
  45. fdtPrenomGTCons.First;
  46. while not fdtPrenomGTCons.Eof do
  47. begin
  48. fdtPrenomGTCons.Edit;
  49. fdtPrenomGTConsSalarioNeto.Value:=fdtPrenomGTConsSalarioAjust.Value + fdtPrenomGTConsEstimAdic.Value;
  50. fdtPrenomGTConsEstimulac.Value:=fdtPrenomGTConsSalarioNeto.Value - fdtPrenomGTConsSalarioDeveng.Value;
  51. // Calcular el formado
  52. if fdtPrenomGTConsIngresos.Value > 0 then
  53. SalForm:=fdtPrenomGTConsIngresos.Value * StrToFloatDef(lblCDSCons.Caption, 0)
  54. else
  55. SalForm:=0;
  56. fdtPrenomGTConsSalarioFormado.Value:=SalForm;
  57. fdtPrenomGTCons.Post;
  58. //--- Totalizar ---
  59. TAjust:=TAjust + fdtPrenomGTConsSalarioAjust.Value;
  60. TPenal:=TPenal + fdtPrenomGTConsPenalizacion.Value;
  61. fdtPrenomGTCons.Next;
  62. end;
  63. fdtPrenomGTCons.First; fdtPrenomGTCons.Refresh;
  64. fdtPrenomGTCons.EnableControls;
  65. qryTotPrenomGTCons.Refresh;
  66. TDeveng:=dbtxtTotSalEsc1.Field.Value + dbtxtTotDFer1.Field.Value + dbtxtTotOtrosP1.Field.Value;
  67. lblDevengCons.Caption:=FloatToStrF(TDeveng, ffNumber, 6, 2);
  68. lblSalAjustCons.Caption:=FloatToStrF(TAjust, ffNumber, 6, 2);
  69. lblTotPenalCons.Caption:=FloatToStrF(TPenal, ffNumber, 6, 2);
  70. end;


Editado por JoAnCa, 28 septiembre 2018 - 11:19 .

  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.394 mensajes
  • LocationRepública Dominicana

Escrito 28 septiembre 2018 - 05:13

A ver, cuando haces la prenomina, estas actualizando ó insertando datos nuevos?, si es insertando, estás haciendo un edit que es editar en de vez insert ó append.


  • 0

#7 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationPinar del Río, Cuba

Escrito 28 septiembre 2018 - 07:21

A ver, cuando haces la prenomina, estas actualizando ó insertando datos nuevos?, si es insertando, estás haciendo un edit que es editar en de vez insert ó append.


Al calcular lo que hago es actualizar la tabla, escribiendo algunos datos calculados que necesito usar despues. Por eso uso edit
  • 0

#8 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationPinar del Río, Cuba

Escrito 29 septiembre 2018 - 11:09   Mejor respuesta

Pues parece que ya se soluciono el problema

Lo que hice fue:
- Inclui en la vista las 2 llaves de la relacion (pues tenia solo la del lado muchos)
- Asigne la llave en la propiedad UpdateOptions.KeyFields

Despues de estos arreglos, probe calculando varias veces en cada area, y no me ha dado mas el error
  • 1