
Programa de gestión desde 0 (Activo)
#81
Posted 23 July 2013 - 01:53 AM
[DELPHI]
procedure TFXPAF.SBDetalleModificarClick(Sender: TObject);
// ------------------------------------------------------------------------------
// *******************************************[ Editar el actual registro ]******
// ------------------------------------------------------------------------------
begin
if DsDetalle.DataSet.IsEmpty<>true then
begin
DsDetalle.DataSet.Edit;
FExtPPAF.Show;
FExtPPAF.DBEdit1.SetFocus;
end else ShowMessage('No existen datos para poder editar');
end;
procedure TFXPAF.SBDetalleBorrarClick(Sender: TObject);
// ------------------------------------------------------------------------------
// **********************************[ Borrar el Actual Registro Desgloce ]******
// ------------------------------------------------------------------------------
begin // Cambiar por el mensaje elegido
if not DsDetalle.DataSet.IsEmpty then
begin
if (MessageBox(0, '¿Esta seguro de eliminar el registro detalle?', // Aqui no se porque me manda la última comilla simple y la coma a la linea de abajo, por favor subir al final de la linea anterior
'Eliminar Registro', MB_ICONSTOP or MB_YESNO or MB_DEFBUTTON2) = ID_No) then
Abort
else
begin
DsDetalle.DataSet.Delete;
ShowMessage('El registro ha sido eliminado');
end;
end
else ShowMessage('No existen datos para eliminar');
end;
[/DELPHI]
#82
Posted 23 July 2013 - 02:16 AM
[DELPHI]procedure TFXPAF.SBDetalleNuevoClick(Sender: TObject);
// ------------------------------------------------------------------------------
// *********************************************************[ Nuevo Detalle ]****
// ------------------------------------------------------------------------------
var I:Integer;
begin
if CambiarEstado=0 then
begin
DsDetalle.DataSet.Insert;
FExtPPAF.ListView1.Items.Clear;
for I := 1 to FExtPPAF.StringGrid1.RowCount - 1 do FExtPPAF.StringGrid1.Rows[i].Clear;
FExtPPAF.Show;
FExtPPAF.DBEdit1.SetFocus;
end;
end;[/DELPHI]
Después del cambio es como queda este procedure y ahora la function
[DELPHI]function TFXPAF.CambiarEstado: Integer;
//------------------------------------------------------------------------------
//*********************************************************[ CambiarEstado ]****
// Nos permite comprobar si los datos necesarios estan rellenos
//------------------------------------------------------------------------------
var varIPaso:Integer;
begin
varIPaso:=0; //Si sigue a 0 grabará y pasará al siguiente
if DsPrincipal.DataSet.State in [DsInsert] then
begin { Si esta en insercion, lo salvamos y editamos, para que acepte los cambios posteriores }
if DM.IBDDocumentosIDDIRECCIONES.IsNull then
begin
if IBQDirecciones.IsEmpty then DM.IBDDocumentosIDDIRECCIONES.Value:=0
else DM.IBDDocumentosIDDIRECCIONES.Value:=IBQDirecciones.FieldByName('IDDIRECCIONES').Value;
end;
DSPrincipal.DataSet.FieldByName('NUMERODOCUMENTO').Value:=DBNNumeroDocumento.Text;
DSPrincipal.DataSet.FieldByName('SERIE').Value:=DBNSerie.Text;
if DSPrincipal.DataSet.FieldByName('CODIGOCLIENTE').IsNull then varIPaso:=1;
if DSPrincipal.DataSet.FieldByName('CODIGOAGENTE').IsNull then varIPaso:=2;
if DSPrincipal.DataSet.FieldByName('FECHA').IsNull then varIPaso:=3;
if DSPrincipal.DataSet.FieldByName('FORMADEPAGO').IsNull then varIPaso:=4;
if DSPrincipal.DataSet.FieldByName('NUMEROPROTECCIONDATOS').IsNull then varIPaso:=5;
if varIPaso=0 then
begin
DsPrincipal.DataSet.Post;
DsPrincipal.DataSet.Edit;
end else
begin
case varIPaso of
1:begin
ShowMessage('Falta por rellenar el código de cliente');
DBNCodigoCliente.SetFocus;
end;
2:begin
ShowMessage('Falta por rellenar el código de agente/comercial');
DBNCodigoComercial.SetFocus;
end;
3:begin
ShowMessage('Falta por rellenar la fecha');
DBNFecha.SetFocus;
end;
4:begin
ShowMessage('Falta por rellenar la forma de pago');
DBNFormaPago.SetFocus;
end;
5:begin
ShowMessage('Falta por rellenar el número de protección de datos');
NDBSENumeroProteccionDatos.SetFocus;
end;
end;
end;
end;
if varIPaso=0 then Result:=0 else Result:=1; //0 = OK, 1 = problema
end;[/DELPHI]
#83
Posted 23 July 2013 - 02:54 AM
[DELPHI]procedure TFXPAF.SBInsertarComentarioClick(Sender: TObject);
// ------------------------------------------------------------------------------
// ************************************************[ Insertar Comentario ]*******
// ------------------------------------------------------------------------------
var VarScadena: string;
begin
VarScadena := InputBox('Comentario a insertar', 'Su comentario', '');
if VarScadena <> '' then
begin
if CambiarEstado=0 then
begin
DsDetalle.DataSet.Insert;
DsDetalle.DataSet.FieldByName('CODIGOARTICULO').value:='COM.';
DsDetalle.DataSet.FieldByName('DESCRIPCIONARTICULO').value:=VarScadena;
DsDetalle.DataSet.FieldByName('CANTIDAD').value:=0;
DsDetalle.DataSet.FieldByName('PRECIOUNIDAD').value:=0;
DsDetalle.DataSet.FieldByName('IMPUESTO').value:=0;
DsDetalle.DataSet.FieldByName('DESCUENTO').value:=0;
DsDetalle.DataSet.FieldByName('COMISION').value:=0;
DsDetalle.DataSet.FieldByName('PESOUNIDAD').value:=0;
DsDetalle.DataSet.FieldByName('MODIFICADO').value:=0;
DsDetalle.DataSet.FieldByName('SERVICIO').value:='N';
end;
end;
end;[/DELPHI]
#84
Posted 23 July 2013 - 04:54 AM
[DELPHI]procedure TFXPAF.SBInsertarMuestraClick(Sender: TObject);
// ------------------------------------------------------------------------------
// **************************************************[ Insertar Muestra ]*******
// ------------------------------------------------------------------------------
begin
if CambiarEstado=0 then FEntrMuestra.Show;
end;[/DELPHI]
Esta la imagen sin extender y extendido

y aquí como siempre el código https://gist.github....onymous/6061538
#85
Posted 23 July 2013 - 05:06 AM
En FXPAF -Nuevo -
[DELPHI]procedure TFXPAF.desgloceBlanco;
//------------------------------------------------------------------------------
//********************************************************[ DesgloceBalnco ]****
// Deja el registro con valores a vacio, negatiovo o 0 para evitar errores
// Tabla detalles
//------------------------------------------------------------------------------
begin
DsDetalle.DataSet.FieldByName('CANTIDAD').value:=0;
DsDetalle.DataSet.FieldByName('PRECIOUNIDAD').value:=0;
DsDetalle.DataSet.FieldByName('IMPUESTO').value:=0;
DsDetalle.DataSet.FieldByName('DESCUENTO').value:=0;
DsDetalle.DataSet.FieldByName('COMISION').value:=0;
DsDetalle.DataSet.FieldByName('PESOUNIDAD').value:=0;
DsDetalle.DataSet.FieldByName('MODIFICADO').value:=0;
DsDetalle.DataSet.FieldByName('SERVICIO').value:='N';
end;
[/DELPHI]
y modificar
[DELPHI]
procedure TFXPAF.SBInsertarComentarioClick(Sender: TObject);
// ------------------------------------------------------------------------------
// ************************************************[ Insertar Comentario ]*******
// ------------------------------------------------------------------------------
var VarScadena: string;
begin
VarScadena := InputBox('Comentario a insertar', 'Su comentario', '');
if VarScadena <> '' then
begin
if CambiarEstado=0 then
begin
DsDetalle.DataSet.Insert;
DsDetalle.DataSet.FieldByName('CODIGOARTICULO').value:='COM.';
DsDetalle.DataSet.FieldByName('DESCRIPCIONARTICULO').value:=VarScadena;
desgloceBlanco;
end;
end;
end;
[/DELPHI]
y en UMuestraEntrega modificar
[DELPHI]procedure TFEntrMuestra.SB_SalirClick(Sender: TObject);
//------------------------------------------------------------------------------
//****************************************************[ Salir y actualizar ]****
//------------------------------------------------------------------------------
var VarSTipoForm:string;
begin
case RadioGroup1.ItemIndex of
0:VarSTipoForm:='Ml.';
1:VarSTipoForm:='L.';
2:VarSTipoForm:='Gr.';
3:VarSTipoForm:='Kg.';
4:VarSTipoForm:='Ud.';
end;
if Edit1.Text<>'' then
begin
FXPAF.DsDetalle.dataset.insert;
FXPAF.desgloceBlanco;
FXPAF.DsDetalle.dataset.FieldByName('IDENTIFICADOR').Value:=FXPAF.DSPrincipal.DataSet.FieldByName('ID').Value;
FXPAF.DsDetalle.dataset.FieldByName('TIPODOCUMENTO').Value:=FXPAF.DSPrincipal.DataSet.FieldByName('TIPODOCUMENTO').Value;
FXPAF.DsDetalle.dataset.FieldByName('NUMERODOCUMENTO').Value:=FXPAF.DSPrincipal.DataSet.FieldByName('NUMERODOCUMENTO').Value;
FXPAF.DsDetalle.dataset.FieldByName('SERIE').Value:=FXPAF.DSPrincipal.DataSet.FieldByName('SERIE').Value;
FXPAF.DsDetalle.dataset.FieldByName('CODIGOARTICULO').Value:='MU';
FXPAF.DsDetalle.dataset.FieldByName('DESCRIPCIONARTICULO').Value:='Muestra de '+Edit1.text+' ['+Edit2.Text+' '+VarSTipoForm+']';
FXPAF.DsDetalle.dataset.FieldByName('CANTIDAD').Value:=SpinEdit1.Value;
FXPAF.DSLoteDocumento.DataSet.Insert; // Grabamos los datos del lote
FXPAF.DSLoteDocumento.DataSet.FieldByName('TIPODOCUMENTO').Value:=FXPAF.DSPrincipal.DataSet.FieldByName('TIPODOCUMENTO').Value;
FXPAF.DSLoteDocumento.DataSet.FieldByName('NUMERODOCUMETO').Value:=FXPAF.DSPrincipal.DataSet.FieldByName('NUMERODOCUMENTO').Value;
FXPAF.DSLoteDocumento.DataSet.FieldByName('SERIE').Value:=FXPAF.DSPrincipal.DataSet.FieldByName('SERIE').Value;
FXPAF.DSLoteDocumento.DataSet.FieldByName('LOTE').Value:=Label5.Caption;
FXPAF.DSLoteDocumento.DataSet.FieldByName('CANTIDAD').Value:=SpinEdit1.Value;
FXPAF.DSLoteDocumento.DataSet.FieldByName('CODIGOARTICULO').Value:='MU';
FXPAF.SetFocus;
FEntrMuestra.Close;
end else ShowMessage('Debe rellenar los datos primeramente, si lo que desea es salir, pulse en cancelar');
end;[/DELPHI]
#86
Posted 23 July 2013 - 05:15 AM
[DELPHI]procedure TFXPAF.SBInstertarComentarioFechaClick(Sender: TObject);
// ------------------------------------------------------------------------------
// **************************************[ Insertar Comentario con fecha ]*******
// ------------------------------------------------------------------------------
var VarScadena: string;
begin
VarScadena := Inputdate('Comentario con fecha', 'Su comentario');
if VarScadena <> '' then
begin
if CambiarEstado=0 then
begin
DsDetalle.DataSet.Insert;
DsDetalle.DataSet.FieldByName('CODIGOARTICULO').value:='COM./FE.';
DsDetalle.DataSet.FieldByName('DESCRIPCIONARTICULO').value:=VarScadena;
desgloceBlanco;
end;
end;
end;[/DELPHI]
y la función a la que hace llamada
[DELPHI]//------------------------------------------------------------------------------
//*************************************************************[ Imputdate ]****
// Parte de la idea original de Felipe Monteiro del 25/05/2006
// bajada de http://www.planetade...utbox-com-combo)
//------------------------------------------------------------------------------
// J.L.G.T. 05/08/2012 Basando me en el código de Felipe Monteiro , lo adapte a
// mis necesidades, creando un imput de doble entrada en mi caso para insertar
// Comentarios Con fecha
//------------------------------------------------------------------------------
// [Acaption] String Texto en la barra del caption
// [Aprompt] String Texto aclaratorio para elmensaje o petición
// [Separadores] Boolean Muestra la fecha entre separadores []
//------------------------------------------------------------------------------
//---EJEMPLO--------------------------------------------------------------------
// procedure TForm1.Button1Click(Sender: TObject);
// begin
// Label1.Caption:=Inputdate('Comentario con fecha','Comentario');
// end;
//------------------------------------------------------------------------------
function Inputdate(const ACaption, APrompt: string; Separadores:Boolean =true): string;
function GetCharSize(Canvas: TCanvas): TPoint;
var
I: Integer;
Buffer: array[0..51] of Char;
begin
for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));
for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));
GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));
Result.X := Result.X div 52;
end;
var
Form: TForm;
Prompt: TLabel;
Combo: TDateTimePicker;
Ed: TEdit;
Labelfec2: TLabel;
DialogUnits: TPoint;
ButtonTop, ButtonWidth, ButtonHeight: Integer;
R: TRect;
begin
Result := '';
Form := TForm.Create(Application);
with Form do
try
Canvas.Font := Font;
DialogUnits := GetCharSize(Canvas);
BorderStyle := bsDialog;
FormStyle :=fsStayOnTop;
Caption := ACaption;
ClientWidth := MulDiv(195, DialogUnits.X, 4);
Position := poScreenCenter;
Prompt := TLabel.Create(Form);
with Prompt do
begin
Parent := Form;
Caption := APrompt;
Left := MulDiv(8, DialogUnits.X, 4);
Top := MulDiv(8, DialogUnits.Y, 8);
Constraints.MaxWidth := MulDiv(180, DialogUnits.X, 4);
WordWrap := True;
end;
Ed:=TEdit.Create(Form);
with Ed do
begin
Parent := Form;
Left := Prompt.Left;
Top := Prompt.top+Prompt.Height+5;
Width := MulDiv(180, DialogUnits.X, 4);
Text :='';
end;
Labelfec2 := TLabel.Create(Form);
with Labelfec2 do
begin
Parent := Form;
Caption := 'Fecha';
Left := Prompt.Left;
Top := ED.top+ED.Height+5;
WordWrap := True;
end;
Combo := TDateTimePicker.Create(Form);
with Combo do
begin
Parent := Form;
Left := Prompt.Left;
Top := Labelfec2.top+Labelfec2.Height+5;
Width := MulDiv(178, DialogUnits.X, 4);
end;
ButtonTop := combo.top+Combo.Height+10;;
ButtonWidth := MulDiv(50, DialogUnits.X, 4);
ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
with TButton.Create(Form) do
begin
Parent := Form;
Caption := 'OK';
ModalResult := mrOk;
default := True;
SetBounds(MulDiv(Prompt.Left-2, DialogUnits.X, 4), ButtonTop, ButtonWidth,
ButtonHeight);
end;
with TButton.Create(Form) do
begin
Parent := Form;
Caption := 'Cancelar';
ModalResult := mrCancel;
Cancel := True;
SetBounds(MulDiv(137, DialogUnits.X, 4), ButtonTop,ButtonWidth, ButtonHeight);
Form.ClientHeight := 140;
end;
if ShowModal = mrOk then
begin
if Separadores then Result:=Ed.Text+' [ '+DateToStr(Combo.Date)+' ]'
else Result:=Ed.Text+' '+DateToStr(Combo.Date);
end;
finally
Form.Free;
end;
end;[/DELPHI]
Como podéis ver estoy dejando para el final los botones cancelar y confirmar, tanto del detalle como del principal.
Ya va quedando menos, pero sigo diciendo que esta es la parte más complicada.
Lo próximo es meternos con la entrada de artículos, que la haremos por partes, primero meteremos el artículo en si, despues veremos el tema de los lotes y el ADR y por último, los cálculos y los botones de grabación y cancelar en cuanto al detalle.
En cuanto al principal, queda toda la gestión de cálculos, Comisiones, financiado, retenciones, impuestos, etc y sus botones claro.
#87
Posted 25 July 2013 - 04:10 AM
Esta es la pantalla

Como podéis ver debemos usar un formulario aparte, ya que a diferencia de una factura, de las que se han venido usando hasta la fecha, tenemos muchos datos más que manejar, pero muchos de ellos, solo los tendremos que usar inicialmente, ya después su uso es automático.
Como siempre el código aquí https://gist.github....onymous/6078466
#88
Posted 25 July 2013 - 04:41 AM

No vamos a comentar el código, que ya esta colocado en el post anterior, pero vamos a por los diferentes puntos.
0) Es el panel que contiene los datos, realmente de ellos directamente manejamos 2 o 3, siendo el principal el código del artículo, ya que el resto, se rellena más por clicks del ratón y otros apartados que directamente.
Al lado del código vemos un botón que abre el formulario de artículos.
1,2,3) son campos de lectura, el 1 y 2, además son informativos, ya que no es de esta manera como se guardara la información, pero es como la presentaremos en nuestro documento +-.
4) Los precios, como podemos ver ene este apartado, tenemos tanto los precios como el rapel y descuentos, en esta pantalla no se ve (ya que aún no lo hemos tratado), pero sobre este cliente, en este artículo si tiene un precio especial, aparecería en la parte baja como Precio Esp. Cliente (Linea 274 del código) y aparecería esta como seleccionada, también tenemos un check a la izquierda que indica el precio seleccionado, pero podemos cambiarlo en cualquier momento.
5) Este es un panel, que nos da información tanto del documento, cliente y comercial.
6) Esta es la madre del cordero, aquí nos muestra la información de todos los lotes de productos que hemos introducido, para este código de artículo, podemos ver que nos indica el lote, la fecha (de entrada), la cantidad de entrada, las unidades que hay disponibles (no aparecen las que estén a 0 o por debajo), y la fecha de caducidad (podemos ver que algunas no tienen datos en este apartado, es debido a las diferentes pruebas iniciales, pero realmente siempre aparecería este dato) y por último la cantidad de artículos que vamos a usar de cada lote.
Realmente el único elemento que vamos a usar es el último, si la cantidad que ponemos es mayor que la disponible para dicho lote, nos avisa y ajusta este al disponible del mismo.
7) Botón de salir y no pasar ninguno de estos datos.
8) Botón de salir y pasar todos estos datos.
9) Buscar, el de la derecha abre el dialogo "buscar por" según elijamos en Descripción o Código (la búsqueda es mediante un LOCATE) y el de la izquierda abre el dialogo de búsquedas ya usado anteriormente en varios módulos que hacemos mediante SQL. (este módulo, lo publicare nuevamente al terminar ya que sigue teniendo varios cambios según avanzamos, aunque la mayoría ya los hemos visto en partes anteriores)
10,12) Este botón abre una pequeña ventana, para introducir un lote manualmente y registrarlo, lo mismo que el apartado 12, pero es mucho más claro el 10 que el 12, este apartado lo veremos a continuación.
11) Botón que abre el módulo de entrada de productos/artículos, que ya hemos visto anteriormente
12) ya lo hemos tratado en el apartado 10
Como siempre si existe alguna duda, me tenéis a vuestra dispocición
#89
Posted 25 July 2013 - 04:44 AM

y su código https://gist.github....onymous/6078637
Como podéis ver su código es bastante reducido
#90
Posted 25 July 2013 - 05:19 AM
Me han preguntado por email, si el programa estará completo, os pongo mi respuesta al tema, depende para que lo uséis, como programa de gestión estándar si, para una empresa de lo mio (química cosmética y productos de limpieza), le faltan apartados, pero lo principal si lo estoy dando. Claro esta como ya he dicho en varias ocasiones, no voy a poner los módulos de impresión.
Otro tema que me ha puesto la misma persona, es el tema de por que doy tanta información, al parecer le molesta por el tema de que se dedica a vender programas y con la información que doy, le parece útil, ya que hay partes que el desconocía, pero que puedo crear una mayor competencia al preparar más personas para la venta de programas de gestión. Mi respuesta ha sido, que si realmente logro preparar, una sola persona, que gracias a este tutorial, sea capaz de crear y vender un programa de gestión, me hará sentir muy orgulloso y feliz de haber realizado este tutorial. En cuanto a la competencia, ya existe y creo que cada persona, deberá adaptar dicho tutorial, a su manera de trabajar, con lo que cada programa sera visualmente diferente y probablemente su código, también variará sustancialmente.
Pretendo dar unos conceptos y aplicación de los mismos al código y espero conseguirlo, no llevamos mucho más de dos meses con este tema y creo que se lleva un buen ritmo y hemos avanzado mucho, por lo menos eso espero, ya que tengo que compartir mi tiempo, entre hacer el programa y llevarlo al tutorial y explicarlo y por supuesto mi familia y trabajo.
Siento si hay gente que se molesta, pero es una aportación lo que hago, creo que debe tomarse como tal y considero, que es un poco egoísta la aptitud de este señor. de todas maneras, ya lo he comentado otras veces en el club, me han acusado, de plagiar y de otras muchas cosas, la verdad es que la mayoria de los compañeros, creo que saben que nunca ha sido mi intención ni plagiar, ni fastidiar a nadie.
De hecho llevo un montón de años (desde el 2003) y no suelo participar en temas que yo no he abierto, ya que temo meter la pata y por que estoy seguro de que muchos compañeros tienen mejores respuestas que las que yo doy, sin embargo, creo que he abierto algunos temas interesante y otros no, pero siempre he facilitado mi código y los componentes creados por mi, como no queráis la sangre también

La verdad es que es algo que me molesta, la aptitud de estos elementos, aún así, nunca he dado los nombres de dichos elementos ni sus emails y no voy hacerlo ahora, pero me gustaría que ciertas personas, se limitarán a exponer sus ideas y comentarios sobre dichos temas en los hilos abiertos sobre los que tratan y no sobre mi email.
#91
Posted 25 July 2013 - 05:22 AM
#92
Posted 25 July 2013 - 07:51 AM
Me han preguntado por email, si el programa estará completo, os pongo mi respuesta al tema, depende para que lo uséis, como programa de gestión estándar si, para una empresa de lo mio (química cosmética y productos de limpieza), le faltan apartados, pero lo principal si lo estoy dando. Claro esta como ya he dicho en varias ocasiones, no voy a poner los módulos de impresión.
Bueno amigo, creo que algo a lo que estaremos siempre expuestos es a la crítica. Esta no siempre nos puede gustar, pero creo que es un proceso natural al publicar contenido de nuestra autoría. Lo que si creo amigo mio es que por encima de toda crítica, buena o mala, lo que haces es admirable. Poca gente de verdad se anima a compartir conocimiento y seguramente por ello quien escribió a tu correo se sintió molesto al ver que compartes algo que para él es crucial. No lo juzgo, sus razones debe tener ya sean válidas o no.
Lo que si me gustaría decirte es que más allá de las críticas que puedas recibir, continues con esta enorme labor. A mi de manera personal me gusta mucho y aunque no he podido complementar tu hilo del diseño de pantallas a pesar de querer hacerlo, puedo decirte que sigo tus explicaciones cada que las publicas.
Así que ánimo amigo.

#93
Posted 25 July 2013 - 08:12 AM
En cuanto a lo de compartir, puedo decir que recibo mucho más de lo que doy, por lo que me parece una aportación mínima comparado con lo que recibo.
Como ya digo
Otro tema que me ha puesto la misma persona, es el tema de por que doy tanta información, al parecer le molesta por el tema de que se dedica a vender programas y con la información que doy, le parece útil, ya que hay partes que el desconocía, pero que puedo crear una mayor competencia al preparar más personas para la venta de programas de gestión. Mi respuesta ha sido, que si realmente logro preparar, una sola persona, que gracias a este tutorial, sea capaz de crear y vender un programa de gestión, me hará sentir muy orgulloso y feliz de haber realizado este tutorial. En cuanto a la competencia, ya existe y creo que cada persona, deberá adaptar dicho tutorial, a su manera de trabajar, con lo que cada programa sera visualmente diferente y probablemente su código, también variará sustancialmente.
Si ayudo a una sola persona, a la que realmente le sea util este tutorial, como para sacar un programa a la venta, gracias a el, mi objetivo esta más que cumplido.
#94
Posted 25 July 2013 - 08:14 AM
Ni hablar, en ésta vida hay de todo. Tu sigue adelante amigo josé Luis

Saludos
#95
Posted 26 July 2013 - 07:23 AM
Como han comentado los demás compañeros, siempre habrá críticas lo importante aquí es como te sientes tu haciendo esta enorme labor aportando a la comunidad.
El 99.99% de este tipo de críticas son de personas mediocres, vanas e incluso poco o nada preparadas y como tal hay que tratarlos. La mejor manera es IGNORAR a estas personas, en tu caso particular la manera mas sencilla es realizar los siguientes pasos:
1.- Acceder a tu cuenta de correo electrónico.
2.- Visualizar el listado de nuevos correos.
3.- Seleccionar (marcar) el correo de este "genio".
4.- Oprimir el botón de eliminar/borrar.
Veras que con estos pequeños pasos sentirás un enorme alivio, el cual te permitiría continuar con esta gran labor.
En mi país, no sé si ocurre en los demás, a los autobuses del transporte publico los dueños por lo regular le etiquetan diversas frases, una de esas frases "cae como anillo al dedo" a esta situación:
Si te causo envidia, trabaja como yo.
Desart Keep Moving Forward
#96
Posted 26 July 2013 - 07:27 AM
Si te causo envidia, trabaja como yo.
Desart Keep Moving Forward










#97
Posted 26 July 2013 - 08:04 AM
Realmente considero, que lo que hago, es simplemente la unión de un montón de código que esta en la red y que yo lo he ido adaptando a mis necesidades, claro que hay algo de código propio, pero es seguro, que habrá mejores formas de hacerlo.
En fin lo tengo en el listado de correos a rechazar, así que espero no siga por ahí, de todas maneras, sigo con lo que tengo que hacer. un saludo compañeros.
#98
Posted 26 July 2013 - 09:01 AM
Gracias Compañeros por vuestro apoyo, normalmente, paso, lo que no entiendo es que no me comentan las cosas en el mismo foro, haciéndolo (según lo veo yo ) por lo privado de manera que parece un ataque.
Realmente considero, que lo que hago, es simplemente la unión de un montón de código que esta en la red y que yo lo he ido adaptando a mis necesidades, claro que hay algo de código propio, pero es seguro, que habrá mejores formas de hacerlo.
En fin lo tengo en el listado de correos a rechazar, así que espero no siga por ahí, de todas maneras, sigo con lo que tengo que hacer. un saludo compañeros.
Es más fácil expresar las cosas sin que los demás vean el verdadero YO de la gente, de lo que puedes estar seguro amigo José Luis es que tu publicación ha impactado mucho, para algunos bien y para otros mal, pero así es la vida misma, eso es lo que le da sabor a las cosas

Saludos
#99
Posted 27 July 2013 - 04:18 AM
Gracias Compañeros por vuestro apoyo, normalmente, paso, lo que no entiendo es que no me comentan las cosas en el mismo foro, haciéndolo (según lo veo yo ) por lo privado de manera que parece un ataque.
Realmente considero, que lo que hago, es simplemente la unión de un montón de código que esta en la red y que yo lo he ido adaptando a mis necesidades, claro que hay algo de código propio, pero es seguro, que habrá mejores formas de hacerlo.
En fin lo tengo en el listado de correos a rechazar, así que espero no siga por ahí, de todas maneras, sigo con lo que tengo que hacer. un saludo compañeros.
Es más fácil expresar las cosas sin que los demás vean el verdadero YO de la gente, de lo que puedes estar seguro amigo José Luis es que tu publicación ha impactado mucho, para algunos bien y para otros mal, pero así es la vida misma, eso es lo que le da sabor a las cosas
Saludos
Gracias Compañero, solo espero, que primero no les duela mucho el impacto


#100
Posted 27 July 2013 - 04:20 AM
//------------------------------------------------------------------------------ //*************************************************[ CamposObligatorios ]**** // Parte de la idea original de Ricardo S. [27/07/2013] // bajada de [url=http://www.planetadelphi.com.br/dica/1281/fun%C3%A7%C3%A3o-que-informa-os-campos-obrigat%C3%B3rios-que-n%C3%A3o-foram-preenchidos,-boa]http://www.planetadelphi.com.br/dica/1281/fun%C3%A7%C3%A3o-que-informa-os-campos-obrigat%C3%B3rios-que-n%C3%A3o-foram-preenchidos,-boa[/url] //------------------------------------------------------------------------------ // Pequeñas modificaciones y adaptado por mi permitiendo comprobar si hat Campos // obligatorios pendientes de rellenar //------------------------------------------------------------------------------ // [DS] TDataSource Originalmente era de un TQuerry // [NoField] string Podemos elegir un campo para que lo omita por // ejemplo 'ID', por defecto ='' //------------------------------------------------------------------------------ //---EJEMPLO-------------------------------------------------------------------- // if CamposObligatorios(DsDetalle,'ID')=true then DsDetalle.dataset.post; //------------------------------------------------------------------------------ function CamposObligatorios(DS:TDataSource; NoField:string=''):Boolean; var j:Byte; Msg:String; begin Msg:=''; Result:=False; with DS.DataSet do begin for j:=0 to FieldCount -1 do if ((Fields[j].Required) and (Fields[j].AsString = '')) and (Fields[j].FieldName<>NoField) then begin if Msg <> '' then Msg:=Msg+' - '; Msg:=Msg+Fields[j].FieldName; end; end; if Msg <> '' then ShowMessage('Atención, el/los campo/s :'+ #13+Msg+' No contiene datos') else Result:=True; end;