Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-07-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Ordenar partes de trabajo en SMDBGrid

Hola a todos,

escribo este hilo para ver si me dais una perspectiva distinta a la mía porque le estoy dando vueltas a un problema para poder ordenar partes de trabajo en un SMDBGrid enlazado a un AdoQuery. Os pongo un poco en situación.
Hay un listado de partes de trabajo. Cuando se da de alta un parte de trabajo no tiene asignada la máquina en la que se va a fabricar, entonces el jefe de producción se va al listado de partes sin clasificar y va arrastrando los partes a las distintas máquinas, cuando pulsa sobre una máquina le aparecen dos listados (dos SMDBGrids distintos al anterior), en la parte superior los partes que ya están ordenados y en la parte inferior los partes pendientes de colocar dentro de la máquina seleccionada.
Estos tres listados (sin clasificar, pendientes de ordenar y ordenados) son la misma tabla, lo único que hago son filtros para mostrar en los distintos SMDBgrids lo que quiero, tengo un campo que se llama "MaquinaElegida"(tipo texto) que es donde se guarda el nombre de la máquina donde se va a fabricar, la clave principal es "NOrden" (tipo numérico) que es el número del parte de trabajo u orden de trabajo, y luego tengo otro campo que es orden (tipo numérico), que es la posición del parte en el orden de fabricación, hay más campos pero no hacen falta para el problema.
el campo orden tiene valor -1 hasta que no sea colocado en un listado de ordenación de una de las máquinas.
Os pongo dos capturas de pantalla para que veais los tres listados:

ListadoMaquina.jpg

ListadoPrincipal.jpg

Los partes se pueden arrastrar desde cualquiera de los listados a los paneles de las máquinas, también se pueden arrastrar desde los pendientes de ordenar a los ordenados y por último se pueden reordenar dentro del mismo listado de partes ordenados.
Tengo controlado la parte de arrastrar a las distintas máquinas desde cualquier listado, en realidad el problema se planteaba al arrastrarlas desde los partes ya ordenados porque hay que reorganizar los que se quedan en la máquina ordenados. También tengo controlado la parte de arrastrar desde los pendientes de ordenar a los ordenados.
El problema lo tengo en esta última parte y os explico el motivo, todos los listados son también multiselect por lo que el jefe de producción puede seleccionar partes salteados entre si y subirlos o bajarlos de posición
Lo que estoy haciendo es tener el listado de partes ordenados por orden que lleva por cada máquina una numeración de 1 a n partes de trabajo.
os pongo el código que llevo hecho para mover partes de trabajo ordenado dentro del mismo SMDBGrid para que os hagais una idea, aunque ya os digo que el código que estoy realizando no me convence nada, por eso era el venir aquí que nunca viene mal que te comenten cosas para encarrilarte por el buen camino.
Código Delphi [-]
    gc:= DBGridDetalleOrdenes.MouseCoord(x, y);
    if (gc.X > 0) AND (gc.Y > 0) then
      begin
        if DBGridDetalleOrdenes.SelectedRows.Count>0 then
          begin
            DBGridDetalleOrdenes.DataSource.DataSet.GotoBookmark(pointer(DBGridDetalleOrdenes.SelectedRows.items[0]));
            DetalleOrden:=DBGridDetalleOrdenes.DataSource.DataSet.FieldByName('orden').AsString;
            DBGridDetalleOrdenes.DataSource.DataSet.GotoBookmark(pointer(DBGridDetalleOrdenes.SelectedRows.items[DbGridDetalleOrdenes.SelectedRows.count-1]));
            orden2:=DbGridDetalleOrdenes.DataSource.DataSet.FieldByName('orden').AsString;
          end
        else
          begin
            if QueryDetalleOrden.IsEmpty=false then
              begin
                DetalleOrden:=QueryDetalleOrden.FieldByName('orden').AsString;
              end
            else
              begin
                exit;
              end;
          end;
        orden1:='';
        DbGridDetalleOrdenes.DataSource.DataSet.MoveBy(gc.Y - THackDBGrid(DbGridDetalleOrdenes).Row);
        orden1:=DBGridDetalleOrdenes.DataSource.DataSet.FieldByName('orden').AsString;
        if strtoint(orden1)then
          begin
            if DBGridDetalleOrdenes.SelectedRows.Count>0 then
              begin
                for w:=0 to DBGridDetalleOrdenes.SelectedRows.Count-1 do
                  begin
                    DbGridDetalleOrdenes.DataSource.DataSet.GotoBookmark(pointer(DBGridDetalleOrdenes.SelectedRows.items[w]));
                    QueryTempOrdenes.Close;
                    QueryTempOrdenes.SQL.Text:='SELECT * FROM ordenes';
                    QueryTempOrdenes.Open;
                    QueryTempOrdenes.Locate('norden',DbGridDetalleOrdenes.DataSource.DataSet.FieldByName('norden').AsStr  ing,[lopartialkey]);
                    DetalleOrden:=QueryTempOrdenes.FieldByName('orden').AsString;
                    QueryTempOrdenes.SQL.Text:='UPDATE ordenes SET orden=orden+1 WHERE orden<='+DetalleOrden+' AND orden>='+inttostr(strtoint(orden1)+w)+' AND maquinaElegida='+quotedstr(DbGridDetalleOrdenes.DataSource.DataSet.FieldByName('maquinaelegida').AsS  tring);
                    QueryTempOrdenes.ExecSQL;
                    QueryTempOrdenes.Close;
                    QueryTempOrdenes.SQL.Text:='SELECT * FROM ordenes';
                    QueryTempOrdenes.Open;
                    if QueryTempOrdenes.Locate('norden',DBGridDetalleOrdenes.DataSource.DataSet.FieldByName('norden').AsStr  ing,[lopartialkey]) then
                      begin
                        QueryTempOrdenes.Edit;
                        QueryTempOrdenes.FieldByName('orden').AsInteger:=strtoint(orden1)+w;
                        QueryTempOrdenes.Post;
                      end;
                  end;
              end
            else
              begin
                if QueryDetalleOrden.IsEmpty=false then
                  begin
                    QueryTempOrdenes.SQL.Text:='UPDATE ordenes SET orden=orden+1 WHERE orden>='+orden1+' AND orden<='+DetalleOrden+' AND maquinaElegida='+quotedstr(QueryDetalleOrden.FieldByName('maquinaelegida').AsString);
                    QueryTempOrdenes.ExecSQL;
                    QueryTempOrdenes.Close;
                    QueryTempOrdenes.SQL.Text:='SELECT * FROM ordenes';
                    QueryTempOrdenes.Open;
                    if QueryTempordenes.Locate('norden',LblNorden.Caption,[lopartialkey]) then
                      begin
                        QueryTempOrdenes.Edit;
                        QueryTempOrdenes.FieldByName('orden').AsString:=orden1;
                        QueryTempOrdenes.Post;
                      end;
                  end
              end;
          end

Bueno, si se os ocurre otra forma de hacerlo o que cosas debería tener en cuenta o lo que sea os estaré agradecido de que me las comenteis, estoy abierto a nuevas ideas.

Saludos y gracias por adelantado que ya se que os he metido un rollaco como un castillo.
Responder Con Cita
  #2  
Antiguo 12-07-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Bueno, he borrado la función que os había puesto antes porque ya me mareaba de tanto orden para arriba y orden para abajo, si sumo o no sumo, cuando sumo, etc...
al final he empezado de 0 y me ha quedado lo siguiente:

Código Delphi [-]
gc:=DBGridDetalleOrdenes.MouseCoord(x,y);
    if (gc.X>0)AND(gc.Y>0) then
      begin
        if DbGridDetalleOrdenes.SelectedRows.Count<1 then
          begin
            if QueryDetalleOrden.IsEmpty=false then
              begin
                DBGridDetalleOrdenes.SelectedRows.CurrentRowSelected:=true;
              end;
          end;
        DbGridDetalleOrdenes.DataSource.DataSet.MoveBy(gc.Y - THackDBGrid(DbGridDetalleOrdenes).Row);
        orden1:='';
        Orden1:=DbGridDetalleOrdenes.DataSource.DataSet.FieldByName('orden').AsString;
        if orden1='' then exit;
        if DbGridDetalleOrdenes.SelectedRows.Count>0 then
          begin
            for w:=0 to DbGridDetalleOrdenes.SelectedRows.Count-1 do
              begin
                DbGridDetalleOrdenes.DataSource.DataSet.GotoBookmark(pointer(DbGridDetalleOrdenes.SelectedRows.items[w]));
                QueryTempOrdenes.Close;
                QueryTempOrdenes.SQL.Text:='SELECT * FROM ordenes';
                QueryTempOrdenes.Open;
                QueryTempOrdenes.Locate('norden',DBGridDetalleOrdenes.DataSource.DataSet.FieldByName('norden').AsStr  ing,[lopartialkey]);
                orden2:=QueryTempOrdenes.FieldByName('orden').AsString;
                if strtoint(orden1)'orden').AsInteger then
                  begin
                    QueryTempOrdenes.SQL.Text:='UPDATE ordenes SET orden=orden+1 WHERE orden>='+orden1+' AND orden<'+orden2+' AND maquinaelegida='+quotedstr(DbGridDetalleOrdenes.DataSource.DataSet.FieldByName('maquinaelegida').AsS  tring);
                    QueryTempOrdenes.ExecSQL;
                    QueryTempOrdenes.SQL.Text:='UPDATE ordenes SET orden='+orden1+' WHERE norden='+DbGridDetalleOrdenes.DataSource.DataSet.FieldByName('norden').AsString;
                    QueryTempOrdenes.ExecSQL;
                    orden1:=inttostr(strtoint(orden1)+1);
                  end
                else
                  begin
                    QueryTempOrdenes.SQL.Text:='UPDATE ordenes SET orden=orden-1 WHERE orden>'+orden2+' AND orden<='+orden1+' AND maquinaElegida='+quotedstr(DBGridDetalleOrdenes.DataSource.DataSet.FieldByName('MaquinaElegida').AsS  tring);
                    QueryTempordenes.ExecSQL;
                    QueryTempOrdenes.SQL.Text:='UPDATE ordenes SET orden='+orden1+' WHERE norden='+DbGridDetalleOrdenes.DataSource.DataSet.FieldByName('norden').AsString;
                    QueryTempOrdenes.ExecSQL;
                  end;
              end;
          end;
      end
    else
      begin
        exit;
      end;  
  end;
BtnRefreshOrdenClick(nil);

lo estoy probando y de momento me funciona, da igual que cojas los partes separados, juntos, de uno en uno, que los muevas hacia arriba o hacia abajo, de momento me está funcionando. Lo dejo aquí por si alguien se le ocurre algo más y por si a alguien le sirve de algo.

Saludos y gracias a todos los que han entrado para ver el problema.

Última edición por ElDioni fecha: 12-07-2011 a las 16:19:20.
Responder Con Cita
  #3  
Antiguo 12-07-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Hay una cosa rara que no se si les pasa a los demás, cuando pego el código de delphi en el hilo las instrucciones se me ven bien, pero cuano publico el hilo hay un if (no me he fijado si pasa en alguna línea más) que se ve recortado, se ve "if strtoint(orden1)'orden').AsInteger then" en lugar de "if strtoint(orden1)<QueryTempOrdenes.FieldByName('orden').AsInteger then". Tenganlo en cuenta a la hora de ver el código por si a alguno también le pasa.

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Timer dentro de SMDBGrid DasGrun OOP 4 28-10-2010 20:21:44
Recorrer SMDbgrid ingel Varios 4 06-07-2007 00:41:27
Checkbox en el FilterBar del SMDBGrid? d-hugo OOP 0 06-04-2007 13:58:41
Columna de SMDbgrid ingel Varios 1 06-06-2006 17:54:36
problema con smdbgrid el_barto OOP 2 18-07-2005 17:26:08


La franja horaria es GMT +2. Ahora son las 01:55:46.


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
Copyright 1996-2007 Club Delphi