Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ayuda con un query de Actualizacion en MySQL (https://www.clubdelphi.com/foros/showthread.php?t=60705)

marcoev 10-10-2008 18:58:03

Ayuda con un query de Actualizacion en MySQL
 
Muy buenos días o tardes tengan todos, espero y puedan ayudarme.

Tengo 2 tablas, la primer tabla seria el padre y la otra la hija, en ambas tengo un campo o bandera que es para indicar si el registro esta disponible, la bandera de la tabla padre depende de todas las banderas de la tabla hija, por lo que si todas las banderas están en True en la hija la bandera del padre debe de estar en True, pero si uno solo de la tabla hija esta en False, la bandera del padre debe de estar en False.

necesito hacer un query (si es que es posible) para que haga estos cambios, el query lo ejecutaría desde mi aplicación.

estoy utilizando MySQL 5, y la verdad no tengo idea de como puedo lograr esto desde SQL, pues lo que hago actualmente es por medio de ciclos y no se me hace que sea la mejor opción.

Cualquier ayuda es bienvenida.

Saludos y espero sus amables comentarios.

marcoev 10-10-2008 19:58:41

pues aqui tengo algo, aunque no esta completo, y no jala :(, pero es un avance y creo que por aqui va

Código SQL [-]
UPDATE Facturas, (SELECT COUNT(Saldada) As Saldadas From FacturasDet Where Saldada = False) As @Saldadas
Set Facturas.Saldada = IF(@Saldadas=0, True, False)


aclaro que las tabla padre es Facturas y la Hijo es FacturasDet, el campo bandera se llama Saldada.

alguien que sepa mas al respecto... gracias.

roman 10-10-2008 20:01:03

Suponiendo que entendí lo que preguntas y tomando en cuenta que un valor booleano es 1 ó 0, se me ocurre lo siguiente:

Código SQL [-]
update padre
set disponible = (select min(disponible) from hijo where codigo_padre = padre.codigo)

Si todos los hijos están disponibles, el mínimo será 1, si por lo menos uno no lo está, el mínimo será 0.

// Saludos

enecumene 10-10-2008 20:02:53

EDITO: Roman ya contestó.

marcoev 10-10-2008 20:19:34

muchas gracias roman por tu respuesta. en si me quedo el codigo como sigue

Código SQL [-]
UPDATE Facturas 
Set Facturas.Saldada = IF((SELECT count(Saldada) As Saldadas From FacturasDet Where Saldada = False) = 0, True, False)

utilice count e if, pues nose, me gusto mas :p, pero la idea seria casi lo mismo. aunque todavia me falta ahora si utilizar las llaves foraneas y esas cosas, espero y me funcione correctamente.

marcoev 10-10-2008 20:33:58

roman, otra consulta, el query funcionaria para cuando se tienen que actualizar varios padres?

osea
Código SQL [-]
update padre
set disponible = (select min(disponible) from hijo where codigo_padre = padre.codigo) Where Padre.Master = ejemplo

donde el padre.Master puede repetirse? esto porque el padre a su vez tiene otro padre... complicado, me imagino quetendria que hacer algun ciclo :(

marcoev 14-10-2008 18:26:17

pues creo que me habia hecho bolas con lo que intentaba hacer, pero ya lo resolvi y creo que de buena forma.

en total hago 3 querys, el primer query marca los hijos del primer padre como saldados si estos ya no tienen "saldo" pendiente

el segundo query verifica si la factura tiene hijos pendientes de saldar, dependiendo del resultado salda o no la factura

y el tercero hace lo mismo que el anterior pero con las entradas y las facturas.

Este es el codigo que finalmente utilize para el proceso...

Código Delphi [-]
      //Registra las salidas y marca o desmarca como saldada...
      qAccion.Close;
      qAccion.SQL.Text:='Update FacturasDet Set Salidas = Salidas + '+
        FloatToStr(edCantidad.FloatValue-CantTmp)+', Saldada = IF(Salidas = CantRec, True, False)' +
        ' Where FolioDet = '+qSalidasDet.FieldByName('FolioDet').AsString;
      qAccion.Execute;

      //Marca o demarca como saldada la factura
      qAccion.Close;
      qAccion.SQL.Text:='Update Facturas Set Saldada = If((Select Count(Saldada) As Total From '+
        'FacturasDet Where Folio = '+FDFolio+' and Saldada = False)>0, False, True)';
      qAccion.Execute;

      //Marca o demarca como saldada la entrada
      qAccion.Close;
      qAccion.SQL.Text:='Update Entradas Set Saldada = If((Select Count(Saldada) As Total From '+
        'Facturas Where NoEntrada = '+QuotedStr(FDEntrada)+' and Saldada = False)>0, False, True)';
      qAccion.Execute;

de igual forma, muchas gracias por su apoyo.

martinb 01-12-2008 14:58:47

master detail con query y ttable
 
Hola tengo un problema cuando quiero hacer un reporte utilizando un query como master y una ttable como detail.

Cuando uso grillas en un formulario anda bien, pero cuando quiero hacer un reporte, este solo imprime los registros del maestro pero ninguno del detalle.

Hay alguna solucion posible o simplemente no se puede hacer un reporte de este tipo. Por cierto uso el componente Qreport.

Espero respuestas. Desde ya gracias.

Saludos CLub delphi


La franja horaria es GMT +2. Ahora son las 23:56:03.

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