Ir al contenido


Foto

Problema con funcion personalizada en componente Advspreadgrid

advspreadgrid tms delphi funcion

  • Por favor identifícate para responder
1 respuesta en este tema

#1 fredymartin

fredymartin

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 21 abril 2015 - 09:06

Ante todo hola a todos, sigo esta pagina desde hace años y debo decir que buena parte de mis dudas las aclare aqui. Estoy probando la version trial del componente Advspreadgrid de TMSSOFTWARE, este componente tiene funcionamiento parecido a una hoja de excel pues se puede introducir formulas en las celdas al estilo excel. Bueno me estoy estancando al querer hacer una funcion personalizada que extraiga datos de una tabla. Paso a detallar la tabla y los codigos con los que probe.

 

Tabla: sueldo, la misma que esta en una base de datos Firebird con la que me conecto mediante Dbexpress.


php
  1. --------------------------------------
  2. | idcargo | idcliente | monto|
  3. |(string) | (string) | (double)|
  4. |----------|----------|---------|
  5. |JEFE | martin | 3000.00 |
  6. |AUXILIAR| daniel| 1200.00 |
  7. |SECRET| julia| 1220.00 |
  8. ---------------------------------------

en el componente antes de procesar se veria asi:


php
  1. | A        | B              |
  2. -------------------------------------
  3. | IDCLIENTE| MONTO          |
  4. ------------------------------------
  5. | martin| =MYFUN(JEFE,A2)   | <-------select monto from sueldo where idclinte=(cell A2) and idcargo=PARAM[0]
  6. ------------------------------------
  7. | julia| =MYFUN(AUXILIAR,A3)| <-------select monto from sueldo where idclinte=(cell A3) and idcargo=PARAM[0]
  8. -------------------------------------
  9. | julia| =MYFUN(SECRET,A4)  | <-------select monto from sueldo where idclinte=(cell A4) and idcargo=PARAM[0]
  10. -------------------------------------

Despues de procesar se veria asi en el componente spreadgrid:


php
  1. | A        | B       |
  2. --------------------------
  3. | IDCLIENTE| MONTO   |
  4. --------------------------
  5. | martin   | 3000.00 |
  6. --------------------------
  7. | julia    | 0.00    |
  8. --------------------------
  9. | julia    | 1220.00 |
  10. --------------------------

1.- Para implementar siguiendo los concejos de la pagina del autor (http://www.tmssoftwa...?s=faq&show=238) hice este codigo:

 


php
  1. procedure TForm1.SpreadSheet1IsCustomFunction(sender: TObject; var func: string;
  2.   var match: Boolean);
  3. begin
  4.   match := func='MYFUN';


php
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   SpreadSheet1.Cells[1,1] := 'IDCLIENTE';
  4.   SpreadSheet1.Cells[1,2] := 'MONTO';
  5.   SpreadSheet1.Cells[2,1] := 'martin';
  6.   SpreadSheet1.Cells[2,2] := '=MYFUN(JEFE,A2)';
  7.   SpreadSheet1.Cells[3,1] := 'julia';
  8.   SpreadSheet1.Cells[3,2] := '=MYFUN(AUXILIAR,A3)';
  9.   SpreadSheet1.Cells[4,1] := 'julia';
  10.   SpreadSheet1.Cells[4,2] := 'MYFUN(SECRET,A4)';
  11.   SpreadSheet1.Recalc;


php
  1. procedure TForm1.SpreadSheet1CalcCustomFunction(sender: TObject;
  2.   var func: string; var param: Double);
  3. begin
  4.     if func='MYFUN' then
  5.     param := param[0]+param[1];

Y e aqui el problema "var param: Double", recoge un solo valor del parametro y en numero real, si le pongo  una funcion con dos parametros como por ejem. "=MYFUN(AUXILIAR,A3" y no funciona, y como es de tipo double si quisiera que trabaje con valores de tipo string tampoco ya funcionaria, bueno al menos eso pienso no se como hacer para que calcule con dos parametros, no se si puedan ver en que parte del codigo estoy fallando.

 

2.-Revisando la pagina del autor del componente encuentre otra guia. https://www.tmssoftw...te/aspglibs.asp, leyendo un poco explica que se puede hacer una funcion personalizada modificando el archivo MiscMathLib.pas del componente mismo, por lo que entendi tiene dos funciones una HandlesFunction en la que retorna verdadero cuando una funcion en el spreadgrid coincide con las funciones de la libreria, y CalcFunction donde se realizan los calculos y formulas de las funciones personalizadas. Por logica aqui en CalcFunction deberia conectarme a la base de datos y hacer un select de lo que necesite, puesto que aqui si se permite la manipulacion de uno o mas parametros como se muestra aqui params es un tparamlist:


php
  1. function TMiscMathLib.CalcFunction(FuncName: string; Params: TParamList;  var ErrType,ErrParam: Integer): Double;

Bueno hice este codigo para conectarme a la base de datos en tiempo de ejecucion y comparar con los dos parametros de la formula personalizada, para que segun el cargo me muestre el monto de cada trabajador listado en la columna del grid, me estoy rompiendo la cabeza probando una y otra cosa y no encuentro donde esta la falla. tanto con este metodo como en el descrito lineas arriba, si alguien tiene idea de donde estoy fallando se los agradeceria muchisimo me lo dijeran. Gracias por la respuesta de antemano.


php
  1. function TMiscMathLib.CalcFunction(FuncName: string; Params: TParamList;
  2. var ErrType,ErrParam: Integer): Double;
  3. var
  4. k: Integer;
  5. aDBXConn: TDBXConnection;
  6. aDBXTrans : TDBXTransaction;
  7. aDBXTrans : TDBXTransaction;
  8. aCmnd: TDBXCommand;
  9. aReader: TDBXReader;
  10. conexion:tdbxconnection;
  11. begin
  12. Result := 0.0;
  13. ErrType := Error_NoError;
  14. if FuncName = 'MYFUN' then
  15. begin
  16. aDBXConn := TDBXConnectionFactory.GetConnectionFactory.GetConnection('basededatos.fdb','sysdba','masterkey');
  17.  
  18. if aDBXConn <> nil then
  19. begin
  20. aCmnd := aDBXConn.CreateCommand;
  21. aDBXTrans:= aDBXConn.BeginTransaction(TDBXIsolations.ReadCommitted);
  22. aCmnd.Text := 'SELECT monto FROM sueldo Where idcliente ='. params.items[1]. ' and idcargo='.params.items[0]. '';
  23. aCmnd.Prepare;
  24. aReader := aCmnd.ExecuteQuery;
  25. while aReader.Next do
  26. begin
  27. Result := aReader.Value['monto'].asfloat;
  28. aDBXConn.CommitFreeAndNil(aDBXTrans);
  29. Readln;
  30. aReader.Free;
  31. aCmnd.Free;
  32. aDbxConn.Free;
  33.  
  34. function TMiscMathLib.HandlesFunction(FuncName: string): boolean;
  35. begin
  36. Result := (FuncName = MYFUN) ;


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

Escrito 21 abril 2015 - 10:23

Que tal fredymartin, bienvenido a DelphiAccess.

 

No conozco éste componente pero veo que hay dos funciones que están ligadas


php
  1. AdvSpreadGrid1CalcCustomFunction();
  2. AdvSpreadGrid1IsCustomFunction();

Pienso que podrías modificar la función AdvSpreadGrid1CalcCustomFunction() para que tome los dos parámetros que quieres, claro, si es que cuentas con los fuentes del componente.

 

Saludos


  • 0





Etiquetado también con una o más de estas palabras: advspreadgrid, tms, delphi, funcion