Vamos con el módulo Unidades, primero os pongo una imagen en uso
Dentro de poco veremos los indicadores puestos en esta imagen, pero antes veamos parte del mismo Form en fase de diseño
Así podéis apreciar el botón de copiar en el panel (PanelOculto)
El siguiente es el código
https://gist.github.com/anonymous/600ac17cef6c1c53c46f
El apartado 1 indica una serie de botones que aun no están activos por lo que este módulo no esta totalmente terminado, dejando el resto para la semana que viene.
El 2 nos muestra una serie de DBLoocupComboBox, que es la manera de leer desde otra tabla a la nuestra sin muchas operaciones por media, después del 3 apartado seguiré hablando de ellos.
El 3 es el Panel nivel que sólo se vera si el usuario tiene un nivel determinado, no estando visible siempre.
Volviendo a los DBLoocupComboBox, debo explicaros que hay 5 apartados que deben estar rellenos para que funcionen estos son
DataSource: Donde ponemos el datasource de la base que pide los datos
DataField: El campo donde guardaremos el dato
ListSource: El datasource de donde obtendremos los datos
KeyField: El Campo clave por donde nos ordenara los datos
ListField: La lista de campos a mostrar, siendo el primero el dato a registrar, para poder mostrar varios campos debemos separa el nombre de estos con un punto y coma (
Pero aun así debemos hacer varios cambios en este componente para que funcione todo lo bien que debería, os diré los que yo hago, en primer lugar cambio la propiedad DropDownWidth para que me deje ver los diversos campos que muestro. si me hace falta cambio también DropDownRows, pero nunca me deja mostrar más de 7 registros, si alguien sabe como que lo comparta
.
Luego usos los eventos Onenter y Onclick como el primero solo añadiendo el siguiente código
Código Delphi
[-]procedure TFunidades.DBLBValorEnter(Sender: TObject);
begin
DM.IBDValorAlquiler.Last;
DBLBValor.perform(CB_SHOWDROPDOWN,1,0);
end;
Si veis la última imagen tenemos 7 datasource, el del principal, los de los 3 querrys y 3 más que parecen estar repetidos, pero no es así, explico por que, de la tabla valor Alquiler, tenemos 2 datasource, el primero esta unido a la tabla directamente y el segundo a un querry (IBQValor), el primero lo uso para posicionarme al final de la tabla y así nos muestre todos los registros en nuestro DBLoocupComboBox, ya que si no sólo mostraría 1 registro, claro que podria usar este mismo Datasource, para mostrar el dato que hay al lado del DBLoocupComboBox en dbtext de color marrón, pero si lo hago asi siempre mostraria un dato no siendo este cierto muchas veces.
Por ello uso el segundo dataSource unido al Querry, para que nos muestre este dato correctamente, usando tanto el procedure comprobar, que ahora veremos como el Onexit de nuestro DBLoocupComboBox.
Código Delphi
[-]begin
if DBLBValor.Text<>'' then ActQuery(IBQValor,'select * from VALOR_ALQUILER WHERE (VALOR_ALQUILER.CODIGO = '+QuotedStr(DBLBValor.Text)+')');
end;
Como dije en comprobar añadimos parte del mismo código, la diferencia es que comprobar sólo se ejecuta cuando la tabla esta en reposo, mientras que con el OnExit lo usamos cuando estemos insertando editando, aclarado esto este es el código.
Código Delphi
[-]procedure TFunidades.comprobar;
begin
if Funidades.Active then
begin
if not (DsPrincipal.DataSet.State in [dsEdit,dsInsert]) then
begin
if not (DM.IBDUnidades.IsEmpty) then
begin
if DsPrincipal.DataSet.FieldByName('NOTAS').Value<>'' then Memo1.Lines.Text:=DsPrincipal.DataSet.FieldByName('NOTAS').AsString
else Memo1.Lines.Clear;
if DBLBFormato.Text<>'' then ActQuery(IBQFormatos,'select * from FORMATOS WHERE (FORMATOS.CODIGO = '+QuotedStr(DBLBFormato.Text)+')');
if DBLBGenero.Text<>'' then ActQuery(IBQGeneros,'select * from GENEROS WHERE (GENEROS.CODIGO = '+QuotedStr(DBLBGenero.Text)+')');
if DBLBValor.Text<>'' then ActQuery(IBQValor,'select * from VALOR_ALQUILER WHERE (VALOR_ALQUILER.CODIGO = '+QuotedStr(DBLBValor.Text)+')');
if (DM.IBDUnidadesDISPONIBLE.value='S') and (DM.IBDUnidadesPERDIDA.value='N') and (DM.IBDUnidadesVENDIDA.value='N') then PanelDatos.Color:=StringToColor(DM.IBDConfiguracionCOLOR_DISPONIBLE.Value);
if (DM.IBDUnidadesDISPONIBLE.value='N') and (DM.IBDUnidadesPERDIDA.value='N') and (DM.IBDUnidadesVENDIDA.value='N') then PanelDatos.Color:=StringToColor(DM.IBDConfiguracionCOLOR_NO_DISPONIBLE.Value);
if (DM.IBDUnidadesDISPONIBLE.value='N') and ((DM.IBDUnidadesPERDIDA.value='S') or (DM.IBDUnidadesVENDIDA.value='S')) then PanelDatos.Color:=StringToColor(DM.IBDConfiguracionCOLOR_BLOQUEADA.Value);
end;
end;
end;
end;
Como veréis también aquí es donde decidimos colocar el color en el panel de datos para que funcione debemos poner a false el ParentBackGorund y el parentColor
Y ya por último usamos el evento OnShow del formulario para decidir si mostramos o no el PanelNivel (3), este es el código
Código Delphi
[-]procedure TFunidades.FormShow(Sender: TObject);
begin
if VarINivelUSuario<8 then PAnelNivel.Visible:=False
else PAnelNivel.Visible:=True;
end;
Como véis si la variable de nivel de usuario es menor de 8 no lo muestra, en caso contrario si.
Se me olvidaba comentar que también he añadido al Onkeypress para que nos admita el saltar entre componente con el entre en los DBLoocupComboBox , podéis verlo en el código completo.
Ahora hasta la próxima semana.