Sei sulla pagina 1di 28

MANUAL DE PROGRAMADOR SISMED MODULOS MOVIL

SERVIDOR

Aqu se almacenaran, todas las funciones que se utilizaran en los diferentes


formularios, la mayora de ellas est conectada a un TFDQuery el cual se
conecta a una TDSprovider para enviar las consultas y conectarla a los
controles, se explicara cada una de ella a continuacin.

SERVERMETHODS1UNIT

unit ServerMethodsUnit1;

interface
//Estas son las librerias y las clases que se implementan en el servidor.
uses System.SysUtils, System.Classes, System.Json,
Datasnap.DSServer, Datasnap.DSAuth,
Datasnap.DSProviderDataModuleAdapter,
FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async,
FireDAC.Phys, Data.DB, FireDAC.Comp.Client, FireDAC.Phys.MySQL,
FireDAC.Phys.MySQLDef, FireDAC.Stan.Param, FireDAC.DatS,
FireDAC.DApt.Intf,
FireDAC.DApt, FireDAC.Comp.DataSet, Datasnap.Provider;

type
//Aqui se implementan todas las variables con su respectivo tipo (clases), como
se observa aqui se implementan los FDQuery, los DataSetProvider y la
conexion a la base de datos el TFDConnection
TServerMethods1 = class(TDSServerModule)
Conexion: TFDConnection;
FDQuery_Validar_Login: TFDQuery;
FDQuery_tipo_usuario: TFDQuery;
DataSetProvider_tipo_usuario: TDataSetProvider;
FDQuery_citas_medico: TFDQuery;
DataSetProvider_cita_med: TDataSetProvider;
FDQuery_nombre: TFDQuery;
DataSetProvider_nombre: TDataSetProvider;
FDQuery_id_usuario: TFDQuery;
FDQuery_citas_paciente: TFDQuery;
DataSetProvider_citas_paciente: TDataSetProvider;
DataSetProvider_id_usuario: TDataSetProvider;
FDQuery_nombre_med: TFDQuery;
DataSetProvider_nombre_med: TDataSetProvider;
FDQuery_id_sede: TFDQuery;
DataSetProvider_id_sede: TDataSetProvider;

//Aqu estn registradas todas las funciones que se implementaran mas


adelante
private
{ Private declarations }
public
{ Public declarations }
function EchoString(Value: string): string;
function ReverseString(Value: string): string;
//Funcion que permite validar usuario y contrasea
function login(user, pass: string): boolean;
//Funcion para determinar el tipo de usuario.
function tipo_usuario(user: string): boolean;
//Funcion para consultar las citas que tiene el medico en agenda en una fecha
determinada
function citas_medico(fecha, id: string): boolean;
//Funcion para consultar el nombre segun la cedula
function nombre(cedula: string): boolean;
//Funcion para consultar el id del usuario usando la cedula
function id_usuario(cedula: string): boolean;
//Funcion para listar el historico de citas de un paciente con su id
function citas_paciente(id:string):boolean;
//Funcion para listar los medicos disponibles para cita segn la fecha
function medicos(fecha:string):boolean;
//Funcion para traer el id de la sede a la cual pertenece un usuario
function traer_sedeid(cedula:string):boolean;
//Funcion para separar un espacio en la agenda de citas
function separar_agenda(id_agenda:string):boolean;
//Funcion para separar una cita
function separar_cita(id_agenda,id_user:string):boolean;
end;

implementation

{ %CLASSGROUP 'FMX.Controls.TControl' }
{$R *.dfm}

uses
System.StrUtils;
//Aqui comienzan a implementarse los metodos, estableciendo sus query y
conectandolos a sus respectivos FDQuery
function TServerMethods1.citas_medico(fecha, id: string): boolean;
//Se declaran dos variables, una tipo string para el query y otra tipo integer
para obtener un resultado booleano
var
query: string;
dato: integer;
begin
query := 'SELECT c.radicado_cita as Radicado,ac.hora_inicio as
Hora,concat(du.prim_nom," ",du.prim_ape) as Paciente FROM cita c
JOIN agenda_citas ac ON ac.id_agenda=c.id_agenda join datos_usuario
du ON du.id_usuario=c.id_usuario WHERE
ac.id_usuario_medico=''' + id + ''' AND c.cod_estado="1" AND
ac.fecha_inicio=''' + fecha + ''' order by ac.hora_inicio';
//De este modo se conecta los query a los FDQuery para que puedan
implementarse cuando sea llamada la funcin.
FDQuery_citas_medico.SQL.Clear;
FDQuery_citas_medico.SQL.Add(query);
FDQuery_citas_medico.Open;
dato := FDQuery_citas_medico.RecordCount;
//Se realiza un RecordCount, para obtener el dato de coincidencias del query
en la base de datos
if (dato > 0) then
begin
Result := true;
end
else
begin
Result := false;
end;
end;

function TServerMethods1.citas_paciente(id: string): boolean;


var
query:AnsiString;
dato:integer;

begin
query:='select c.radicado_cita as Codigo_Cita,tc.tipo
Tipo_De_Cita,ac.fecha_inicio as Fecha,ac.hora_inicio as Hora,'+
'ec.estado as Estado,du.prim_nom as Nombre,du.prim_ape as
Apellido,c.id_agenda as Id_Agenda,se.nombre as Sede from
sismed1.cita c '+
'join sismed1.tipo_cita tc on c.cod_tipo=tc.cod_tipo join
sismed1.agenda_citas ac'+
' on ac.id_agenda= c.id_Agenda join sismed1.estado_cita ec on '+
'ec.cod_estado=c.cod_estado join sismed1.datos_usuario du on
du.id_usuario=ac.id_usuario_medico'+
' join sismed1.sedes se on se.cod_sede=du.cod_sede where
c.id_usuario='''+id+'''';

FDQuery_citas_paciente.SQL.Clear;
FDQuery_citas_paciente.SQL.Add(query);
FDQuery_citas_paciente.Open;
dato := FDQuery_citas_paciente.RecordCount;

if (dato > 0) then


begin
Result := true;
end
else
begin
Result := false;
end;

end;
//Esta funcin es inherente del sistema
function TServerMethods1.EchoString(Value: string): string;
begin
Result := Value;
end;
function TServerMethods1.id_usuario(cedula: string): boolean;
var
query: string;
dato:integer;

begin
query:='select id_usuario from datos_usuario where
num_doc='''+cedula+'''';

FDQuery_id_usuario.SQL.Clear;
FDQuery_id_usuario.SQL.Add(query);
FDQuery_id_usuario.Open;
dato := FDQuery_id_usuario.RecordCount;

if (dato > 0) then


begin
Result := true;
end
else
begin
Result := false;
end;
end;

function TServerMethods1.login(user, pass: string): boolean;


var
query: string;
dato: integer;
begin
if (user = '') or (pass = '') then
begin
Result := false;
end
else
begin
query := 'select num_doc, password from datos_usuario where
num_doc=''' +
user + ''' and password=''' + pass + '''';
FDQuery_Validar_Login.SQL.Clear;
FDQuery_Validar_Login.SQL.Add(query);
FDQuery_Validar_Login.Open;
dato := FDQuery_Validar_Login.RecordCount;

if (dato > 0) then


begin
Result := true;
end
else
begin
Result := false;
end;
end;
end;

function TServerMethods1.medicos(fecha:string): boolean;


var
query:string;
dato:integer;

begin
query:='SELECT ag.id_agenda as CodigoAgenda, du.id_usuario as
CodigoMedico, du.PRIM_NOM as nombre, du.PRIM_APE as
apellido,hora_inicio as hora from datos_usuario du join agenda_citas
ag where ag.id_usuario_medico=du.id_usuario and
ag.fecha_inicio='''+fecha+''' and ag.disponible="s"';

FDQuery_nombre_med.SQL.Clear;
FDQuery_nombre_med.SQL.Add(query);
FDQuery_nombre_med.Open;
dato := FDQuery_nombre_med.RecordCount;

if (dato > 0) then


begin
Result := true;
end
else
begin
Result := false;
end;
end;

function TServerMethods1.nombre(cedula: string): boolean;


var
query: string;
dato: integer;
begin
query := 'Select prim_nom, prim_ape from datos_usuario where
num_doc='''+ cedula + '''';

FDQuery_nombre.SQL.Clear;
FDQuery_nombre.SQL.Add(query);
FDQuery_nombre.Open;
dato:=FDQuery_nombre.RecordCount;

if (dato > 0) then


begin
Result := true;
end
else
begin
Result := false;
end;
end;

//Esta es otra function inherente del sistema


function TServerMethods1.ReverseString(Value: string): string;
begin
Result := System.StrUtils.ReverseString(Value);
end;

function TServerMethods1.separar_agenda(id_agenda: string):


boolean;
var
query:string;
begin
query:='update agenda_citas set disponible="N" where
id_agenda='''+id_agenda+'''';

try
Conexion.ExecSQL(query,[]);
result:=true;
except

end;
end;

function TServerMethods1.separar_cita(id_agenda, id_user: string):


boolean;
var
query:string;
begin
query:='insert into cita (cod_tipo,cod_estado,id_usuario,id_agenda)' +
'values("1","1",'''+id_user+''','''+id_agenda+''')';
//En este caso no se conecta a un FDQuery pues no devuelve un valor, en este
caso se conecta de manera directa.
try
Conexion.ExecSQL(query,[]);
result:=true;
except
end;
end;

function TServerMethods1.tipo_usuario(user: string): boolean;


var
query: string;
dato: integer;
begin
query := 'select id_tipo_usuario from datos_usuario where num_doc='''
+
user + '''';
FDQuery_tipo_usuario.SQL.Clear;
FDQuery_tipo_usuario.SQL.Add(query);
FDQuery_tipo_usuario.Open;
dato:=FDQuery_tipo_usuario.RecordCount;

if (dato > 0) then


begin
Result := true;
end
else
begin
Result := false;
end;
end;

function TServerMethods1.traer_sedeid(cedula: string): boolean;


var
query: string;
dato:integer;

begin
query:='select cod_sede from datos_usuario where
cedula='''+cedula+'''';

FDQuery_id_sede.SQL.Clear;
FDQuery_id_sede.SQL.Add(query);
FDQuery_id_sede.Open;
dato:=FDQuery_id_sede.RecordCount;

if (dato > 0) then


begin
Result := true;
end
else
begin
Result := false;
end;
end;
end.
MODULO DE INICIO DE SESION
Este mdulo est dedicado al ingreso a la aplicacin identificndose con un
usuario y contrasea, este dirigir a un mdulo para Mdicos y un mdulo para
Pacientes dependiendo del usuario. Los administradores y auxiliares no podrn
acceder pues no est diseada la aplicacin para sus tareas.

unit ULogin;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.StdCtrls,
FMX.Controls.Presentation, FMX.Edit, IdHashMessageDigest,
Data.DBXDataSnap,
IPPeerClient, Data.DBXCommon, Data.DB, Data.SqlExpr, Datasnap.DBClient,
Datasnap.DSConnect, Data.Bind.EngExt, FMX.Bind.DBEngExt, System.Rtti,
System.Bindings.Outputs, FMX.Bind.Editors, Data.Bind.Components,
Data.Bind.DBScope, FMX.MaterialSources, FMX.Layouts, FMX.ExtCtrls;

type
TfrmLogin = class(TForm)
Label1: TLabel;
cedula: TLabel;
contrasea: TLabel;
user: TEdit;
pass: TEdit;
acceder: TButton;
exit: TButton;
SQLConnection1: TSQLConnection;
ClientDataSet1: TClientDataSet;
DSProviderConnection1: TDSProviderConnection;
StyleBook1: TStyleBook;
procedure accederClick(Sender: TObject);
procedure exitClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }

end;

var
frmLogin: TfrmLogin;

implementation

{$R *.fmx}
//Aqui hace llamado a otros ofrmularios para usar su informacion, ademas se
hace llamdo al UServerClases el cual es el Puente con el servidoe, pemitiendo
conectar a las funciones con los objetos que las llamen
uses UServerClases, UMedico1, UPaciente1;

procedure TfrmLogin.accederClick(Sender: TObject);


var
password, prueba: string;
md5: TIdHashMessageDigest5;
dato: TServerMethods1Client;

begin
//Se valida que los campos no esten vacios
if (user.Text = '') or (pass.Text = '') then
begin
ShowMessage('Por favor ingrese todos los datos');
end
else
begin

md5 := TIdHashMessageDigest5.Create;
password := md5.HashStringAsHex(pass.Text);

//Esta variable, permite llamar la conexin con el servidor para ejecutar las
funciones
dato := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
if (dato.login(user.Text, password) = true) then //Se valida si el login fue
correcto
begin

//Se obtiene el tipo de dato y con ello se orienta el destino


if (dato.tipo_usuario(user.Text) = true) then
begin
ClientDataSet1.Close;
ClientDataSet1.Open;
//Se obetiene el valor del campo solicitado y se almacena en una variable
prueba:=ClientDataSet1.Fields[0].AsString;

if(prueba='2') or (prueba='3') then


begin
//Se abre el formulario de pacientes
frmLogin.Visible:=false;
frmPaciente1.ShowModal;
frmLogin.Close;

end;
if (prueba='4') then
begin
//se abre el formulario de medicos
frmLogin.Visible:=false;
frmMedico.ShowModal;
frmLogin.Close;

end;
if (prueba='1') then
begin
//Si no cumple con el limite de los tipos de usuario se arroja este mensaje
ShowMessage('Seor Administrador o Auxiliar, para hacer uso de la
plataforma SISMED dirijase a nuestra pagina web: www.sismed.comxa.com');
end;
end;
end
else
begin
//si no coincide el usuario y la contrasea con la base de datos, arroja este
mensaje
ShowMessage('El usuario y la contrasea estn incorrectos, o no se
encuentran en nuestra base de datos');

end;
end;
end;

procedure TfrmLogin.exitClick(Sender: TObject);


begin
Application.Terminate;
end;
end.
MODULO PARA MEDICOS

Este modulo esta dividido en dos seccines UMedico1 UMedico2 una se


conecta con la otra.
En UMedico1 principalmente se encarga de seleccionar la fecha del itinerario
que el medico desee consultar, al seleccionar esta fecha se enva a UMedico2
donde se mostrara el listado de citas del dia seleccionado.

UMedico1 frmMedico
--------------
unit UMedico1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.StdCtrls,
FMX.ListBox, FMX.DateTimeCtrls, Data.DBXDataSnap, IPPeerClient,
Data.DBXCommon, Data.DB, Datasnap.DBClient, Datasnap.DSConnect,
Data.SqlExpr,
Data.Bind.EngExt, Fmx.Bind.DBEngExt, System.Rtti, System.Bindings.Outputs,
Fmx.Bind.Editors, Data.Bind.Components, Data.Bind.DBScope;

Type //Aqui se envidencian los controles u objetos que se implementan en el


form
TfrmMedico = class(TForm)
title: TLabel;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
DateEdit1: TDateEdit;
SQLConnection1: TSQLConnection;
DSProviderConnection1: TDSProviderConnection;
ClientDataSet1: TClientDataSet;
Label3: TLabel;
BindSourceDB1: TBindSourceDB;
BindingsList1: TBindingsList;
LinkPropertyToFieldText: TLinkPropertyToField;
LinkPropertyToFieldText2: TLinkPropertyToField;
StyleBook1: TStyleBook;
//Estos son los procedimientos exclusivos del form, donde se mostraran
acciones especficas que se decida implementar.
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
//Estas son variables que se implementan de manera publica en el form para
que puedan ser llamadas en cualquier momento
var
cedula:string;
end;

var
frmMedico: TfrmMedico;
implementation

{$R *.fmx}
{$R *.NmXhdpiPh.fmx ANDROID}

uses UServerClases, ULogin, UMedico2;

//Este es un procediemiento de accion de boton, se genera automaticamente al


hacer doble lcik n el control, aqui se configuran todas las acciones y variables
al oprimir el boton, en este caso se trata de un botn de movilizacin del form
actual al form frmMedico2, ocultando el actual.
procedure TfrmMedico.Button1Click(Sender: TObject);
begin
frmMedico.visible:=false;
frmMedico2.Show;
end;

procedure TfrmMedico.Button2Click(Sender: TObject);


begin
frmLogin.Show;
frmMedico.Close;
end;

//Este es un procedimiento de evento del formulario, indica que en cuanto el


formulario este activo se realice una consulta de nombre de usuario con base
en la cedula, y se cargue en un label
procedure TfrmMedico.FormActivate(Sender: TObject);
var
nombre,apellido:string;
cita:TServerMethods1Client;
begin
cedula:=frmLogin.user.Text; //Se llama la cedula desde el form frmLogin
cita:=TServerMethods1Client.Create(SQLConnection1.DBXConnection);

if(cita.nombre(cedula)=true) then
begin
ClientDataSet1.Close;
ClientDataSet1.Open;
nombre:=ClientDataSet1.Fields[0].AsString;
apellido:=ClientDataSet1.Fields[1].AsString;
label2.Text:=nombre+' '+apellido;
end;
end;
end.

UMedico2 frmMedico2

unit UMedico2;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
System.Rtti,
FMX.StdCtrls, FMX.Layouts, FMX.Grid, Data.DBXDataSnap, IPPeerClient,
Data.DBXCommon, Data.DB, Datasnap.DBClient, Datasnap.DSConnect,
Data.SqlExpr,
Data.Bind.EngExt, Fmx.Bind.DBEngExt, Fmx.Bind.Grid,
System.Bindings.Outputs,
Fmx.Bind.Editors, Data.Bind.Components, Data.Bind.Grid, Data.Bind.DBScope;

type
TfrmMedico2 = class(TForm)
Label1: TLabel;
StringGrid1: TStringGrid;
Button1: TButton;
Button2: TButton;
Label3: TLabel;
DSProviderConnection1: TDSProviderConnection;
BindingsList1: TBindingsList;
Label2: TLabel;
ClientDataSet1: TClientDataSet;
ClientDataSet1Radicado: TIntegerField;
ClientDataSet1Hora: TTimeField;
ClientDataSet1Paciente: TStringField;
SQLConnection1: TSQLConnection;
BindSourceDB1: TBindSourceDB;
LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;

procedure FormActive(Sender: TObject);


procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
var
cedula,fecha: string;
end;

var
frmMedico2: TfrmMedico2;

implementation

{$R *.fmx}

uses UServerClases, ULogin, UMedico1;


//Con este boton se regresa al formulario 1 de Medico
procedure TfrmMedico2.Button1Click(Sender: TObject);
begin
frmMedico2.visible:=false;
frmMedico.Show;
frmMedico.Visible:=true;
end;

//Con este boton se regresa al login y se cierra el form


procedure TfrmMedico2.Button2Click(Sender: TObject);
begin
frmLogin.Show;
frmMedico2.Close;
end;
//Este procedimiento carga las citas del medico al activarse el form
procedure TfrmMedico2.FormActive(Sender: TObject);
var
cita: TServerMethods1Client;
begin
cedula:=frmLogin.user.Text;
fecha:=frmMedico.DateEdit1.Text;
Label2.Text:=fecha;
cita:=TServerMethods1Client.Create(SQLConnection1.DBXConnection);
StringGrid1.Visible:=false;

if(cita.citas_medico(fecha,'1')=false)then
begin
ShowMessage('NO TIENE CITAS ASIGNADAS EN ESTA FECHA');
end
else
begin
StringGrid1.Visible:=true;
ClientDataSet1.Close;
ClientDataSet1.Open;
end;
end;
end.
MODULO PACIENTES

Este mdulo le permite l paciente conocer su historial de citas mdicas, tiene


disponible un formulario para solicitarlas validando por fecha y disponibilidad
de agenda.

unit UMedico2;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
System.Rtti,
FMX.StdCtrls, FMX.Layouts, FMX.Grid, Data.DBXDataSnap, IPPeerClient,
Data.DBXCommon, Data.DB, Datasnap.DBClient, Datasnap.DSConnect,
Data.SqlExpr,
Data.Bind.EngExt, Fmx.Bind.DBEngExt, Fmx.Bind.Grid,
System.Bindings.Outputs,
Fmx.Bind.Editors, Data.Bind.Components, Data.Bind.Grid, Data.Bind.DBScope;

type
TfrmMedico2 = class(TForm)
Label1: TLabel;
StringGrid1: TStringGrid;
Button1: TButton;
Button2: TButton;
Label3: TLabel;
DSProviderConnection1: TDSProviderConnection;
BindingsList1: TBindingsList;
Label2: TLabel;
ClientDataSet1: TClientDataSet;
ClientDataSet1Radicado: TIntegerField;
ClientDataSet1Hora: TTimeField;
ClientDataSet1Paciente: TStringField;
SQLConnection1: TSQLConnection;
BindSourceDB1: TBindSourceDB;
LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;

procedure FormActive(Sender: TObject);


procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
var
cedula,fecha: string;
end;

var
frmMedico2: TfrmMedico2;

implementation

{$R *.fmx}

uses UServerClases, ULogin, UMedico1;


procedure TfrmMedico2.Button1Click(Sender: TObject);
begin
frmMedico2.visible:=false;
frmMedico.Show;
frmMedico.Visible:=true;
end;

procedure TfrmMedico2.Button2Click(Sender: TObject);


begin
frmLogin.Show;
frmMedico2.Close;
end;

procedure TfrmMedico2.FormActive(Sender: TObject);


var
cita: TServerMethods1Client;
begin
cedula:=frmLogin.user.Text;
fecha:=frmMedico.DateEdit1.Text;
Label2.Text:=fecha;
cita:=TServerMethods1Client.Create(SQLConnection1.DBXConnection);
StringGrid1.Visible:=false;

if(cita.citas_medico(fecha,'1')=false)then
begin
ShowMessage('NO TIENE CITAS ASIGNADAS EN ESTA FECHA');
end
else
begin
StringGrid1.Visible:=true;
ClientDataSet1.Close;
ClientDataSet1.Open;
end;
end;
end.

Potrebbero piacerti anche