Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Función SUM Pasarlo a un componente (https://www.clubdelphi.com/foros/showthread.php?t=96864)

maravert 29-09-2024 18:23:18

Función SUM Pasarlo a un componente
 
1 Archivos Adjunto(s)
Buenos días, estoy tratando de obtener la suma de un campo llamado Importe y pasar el resultado a un Label,
pero me dice que mi variable no existe.

Mi código es el siguiente

Código Delphi [-]
procedure TfrmAdminColeg.Button3Click(Sender: TObject);
var
  TotalImporte, Total: Double;
begin
  DM.CuentasPorCobrar.SQL.Clear;
  DM.CuentasPorCobrar.SQL.Add('SELECT SUM(importe) AS Total FROM CuentasPorCobrar');
  DM.CuentasPorCobrar.Open;
  if not DM.CuentasPorCobrar.FieldByName('Total').IsNull then
  begin
    TotalImporte := DM.CuentasPorCobrar.FieldByName('Total').AsFloat;
    Label4.Caption := FormatFloat('0.00', TotalImporte); // Formatear a dos decimales
  end
  else
  begin
    Label4.Caption := '0.00';
  end;
  DM.CuentasPorCobrar.Close;
end;


Me da el siguiente error

Casimiro Notevi 29-09-2024 18:32:56

Prueba con:
Código Delphi [-]
DM.CuentasPorCobrar.Fields[0].asFloat

maravert 29-09-2024 18:49:07

Muchas gracias por tu respuesta, hice las modificaciones así.

Código Delphi [-]
 TotalImporte := DM.CuentasPorCobrar.Fields[0].Value;

Pero me regresa el valor de 1

Casimiro Notevi 29-09-2024 19:09:28

Pues sumará 1, ¿no?
En eso no podemos ayudar sin más información y datos de ejemplo.

maravert 29-09-2024 19:31:26

Gracias por contestar, tengo una tabla con la siguiente estructura

Código SQL [-]
CREATE TABLE `CuentasPorCobrar` (
  `idColegiatura` int NOT NULL,
  `idGpo` int DEFAULT NULL,
  `idAlumno` int NOT NULL,
  `CuentasPorCobrarMaestro` int NOT NULL,
  `DiasTolerancia` int NOT NULL,
  `Referencia` int NOT NULL,
  `NumeroCargo` int NOT NULL,
  `Importe` decimal(10,2) NOT NULL,
  `FechaAplicacion` datetime NOT NULL,
  `FechaVencimiento` datetime NOT NULL,
  `Usuario` int NOT NULL,
  `Semestre` smallint DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

y lo que necesito es obtener el total del campo importe y pasarlo a un Label

Gracias, muy agradecido

Casimiro Notevi 29-09-2024 20:38:26

Si abres el phpmyadmin, o el que uses, y tecleas:
Código SQL [-]
SELECT SUM(importe) FROM CuentasPorCobrar
¿Qué te devuelve?

marco3k 30-09-2024 15:49:27

Quizas sea por la mayúsculas o minúsculas en los nombres de tablas y campos, hay algunos servidores que estan configurados asi, distinguen eso y me paso y debí colocar tal como esta creado en el servidor, revisa eso.

navbuoy 05-10-2024 11:44:38

es que el AS Total implica que lo dejara creo, en una variable Total que no tienes definida

yo por ejemplo para un Stored Procedure que hice hace 2 dias es asi, puede que te arroje algo de luz porque es algo parecido

Código:

DELIMITER $$

USE `BASE_DE_DATOS_A_USAR`$$

DROP PROCEDURE IF EXISTS `Stardust_Players_Conected`$$

CREATE DEFINER=`USUARIOBD`@`%` PROCEDURE `Stardust_Players_Conected`()
BEGIN
    DECLARE suma_total DECIMAL(10, 0);
    -- Sumar los valores de campo_a_sumar cuando condicion_campo es 1
    SELECT COALESCE(SUM(status_online), 0) INTO suma_total
    FROM STARDUST_BDUsers
    WHERE status_online = 1;
    -- Insertar el resultado en la tabla resultados_suma
    TRUNCATE TABLE STARDUST_TOTAL_PLAYERS_CONECTADOS;
    INSERT INTO STARDUST_TOTAL_PLAYERS_CONECTADOS (NUM_PLAYERS, Fecha)
    VALUES (suma_total, CURDATE());
    END$$

DELIMITER ;

como ves, el DECLARE suma_total es lo que seria tu Total que no encuentra

si "suma_total" es con decimales lo declaramos (por ejemplo con 2 decimales) como DECLARE suma_total DECIMAL(10, 2);

el COALESCE es por si no tiene valor ese campo o registro (NULL) creo que lo pone como 0

seria algo asi para pasarlo al TLabel o TEdit

Código:

void PasarSumaTotalAMyLabel() {
    // Supongamos que tienes un componente TMyQuery llamado MyQuery
    MyQuery->SQL->Clear();
    MyQuery->SQL->Add("SELECT SUM(Importe) INTO Total FROM CuentasPorCobrar");  // Tu consulta SQL
    MyQuery->Open();  // Ejecuta la consulta

    // Verificamos si hay resultados
    if (!MyQuery->Eof) {
        // Extraer el valor de 'Total'
        double sumaTotal = MyQuery->FieldByName("Total")->AsFloat;

        // Convertir el valor a texto y asignarlo al TLabel
        Label1->Caption = FloatToStr(Total);
    } else {
        Label1->Caption = "No hay resultados";  // En caso de no obtener resultados
    }

    MyQuery->Close();
}

TEN EN CUENTA QUE EL CAMPO Importe tiene la I en mayuscula en la definicion de la Tabla y eso creo que importa porque diferencia mayusculas de minusculas

Este tipo de consulta devuelve directamente la suma de un campo llamado campo en la tabla tu_tabla, y puedes extraer el valor de suma_total directamente desde el conjunto de resultados sin declarar nada en SQL.

Código:

// Asumiendo que tienes un componente TMyQuery llamado MyQuery
MyQuery->SQL->Clear();
MyQuery->SQL->Add("SELECT SUM(campo) AS suma_total FROM tu_tabla");  // La consulta SQL
MyQuery->Open();  // Ejecuta la consulta y abre el conjunto de resultados

if (!MyQuery->Eof) {  // Asegurarse que hay resultados
    double sumaTotal = MyQuery->FieldByName("suma_total")->AsFloat;  // Recuperar el resultado de la suma
    Label1->Caption = FloatToStr(sumaTotal);  // Mostrar en el Label
}


navbuoy 05-10-2024 12:08:39

y tu tienes en el SELECT SUM(importe) con minusculas y creo que en vez de AS deberias poner INTO

creo que lo que buscas se parece a ESTO: (si no funciona con AS prueba con INTO)

Código:

procedure PasarSumaTotalAMyLabel;
begin
  // Limpiar el SQL y añadir la consulta
  MyQuery.SQL.Clear;
  MyQuery.SQL.Add('SELECT SUM(Importe) AS Total FROM CuentasPorCobrar');  // Tu consulta SQL
  MyQuery.Open;  // Ejecuta la consulta

  // Verificamos si hay resultados
  if not MyQuery.Eof then
  begin
    // Extraer el valor de 'Total'
    Label1.Caption := FloatToStr(MyQuery.FieldByName('Total').AsFloat);
  end
  else
  begin
    Label1.Caption := 'No hay resultados';  // En caso de no obtener resultados
  end;

  MyQuery.Close;
end;

date cuenta que en tu codigo cuando intentas recuperar el "Total" haces referencia a la Tabla CuentasPorCobrar->FieldByName("Total") y no deberias sacarlo de ahi porque en la tabla no esta el campo Total sino en el resultado del MyQuery.... es algo asi como si el propio MyQuery crease una especie de campo "fantasma" temporal para Total con el resultado que luego al cerrar la consulta desaparece


La franja horaria es GMT +2. Ahora son las 17:52:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi