PageRenderTime 39ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/Fuentes/UTiposDiario.pas

http://sencontab.googlecode.com/
Pascal | 444 lines | 386 code | 45 blank | 13 comment | 38 complexity | 336437340e0c80a49445bbb7eac2a902 MD5 | raw file
  1. unit UTiposDiario;
  2. interface
  3. uses Buttons, Classes, Controls, DB, DBClient, DBCtrls, DBTables, Dialogs, ExtCtrls, fcButton, fcImage,
  4. fcimageform, fcImgBtn, Forms, Graphics, Grids, IBCustomDataSet, IBDatabase, IBTableSet, jpeg, Mask,
  5. Messages, navegadorNotarios, OvcBase, OvcDbNF, OvcDbPF, OvcEF, OvcNF, OvcPB, OvcPF, StdCtrls,
  6. SysUtils, WinProcs, WinTypes, Wwdatsrc, Wwdbgrid, Wwdbigrd, Wwkeycb, CustomView;
  7. type
  8. TWTiposDiario = class(TCustomView)
  9. OvcController1: TOvcController;
  10. SFichero: TwwDataSource;
  11. QFichero: TIBTableSet;
  12. Transaccion: TIBTransaction;
  13. Datos: TGroupBox;
  14. Label1: TLabel;
  15. Label2: TLabel;
  16. eDescripcion: TOvcDbPictureField;
  17. Shape1: TShape;
  18. Label3: TLabel;
  19. Panel1: TPanel;
  20. BtnNavAniadir: TfcImageBtn;
  21. BtnNavBorrar: TfcImageBtn;
  22. BtnNavCerrar: TfcImageBtn;
  23. BtnEdtGuardar: TfcImageBtn;
  24. BtnEdtCancelar: TfcImageBtn;
  25. FiltroBuscar: TGroupBox;
  26. FiltroBDescripcion: TOvcDbPictureField;
  27. TbFiltro: TClientDataSet;
  28. sFiltro: TDataSource;
  29. fcIBCerrar: TfcImageBtn;
  30. Panel3: TPanel;
  31. Panel5: TPanel;
  32. Panel4: TPanel;
  33. fcImageBtnMinimizar: TfcImageBtn;
  34. PanelSombra: TPanel;
  35. Navegador: TDBNavegadorNotarios;
  36. Label4: TLabel;
  37. Label5: TLabel;
  38. BtnNavFiltro: TfcImageBtn;
  39. BtnNavImprimir: TfcImageBtn;
  40. BtnNavModificar: TfcImageBtn;
  41. eCodigo: TOvcDbPictureField;
  42. FiltroBCodigo: TOvcDbPictureField;
  43. QFicheroDESCRIPCION: TIBStringField;
  44. QFicheroTIPODIARIO: TIBStringField;
  45. Rejilla: TwwDBGrid;
  46. Panel2: TPanel;
  47. Formulario: TfcImageForm;
  48. procedure BtnNavAniadirClick(Sender: TObject);
  49. procedure BtnNavBorrarClick(Sender: TObject);
  50. procedure BtnEdtGuardarClick(Sender: TObject);
  51. procedure BtnEdtCancelarClick(Sender: TObject);
  52. procedure RejillaDblClick(Sender: TObject);
  53. procedure FormKeyPress(Sender: TObject; var Key: Char);
  54. procedure FormShow(Sender: TObject);
  55. procedure FormCreate(Sender: TObject);
  56. procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  57. procedure RejillaTitleButtonClick(Sender: TObject; AFieldName: String);
  58. procedure RejillaCalcTitleAttributes(Sender: TObject; AFieldName: String;
  59. AFont: TFont; ABrush: TBrush; var ATitleAlignment: TAlignment);
  60. procedure BtnNavCerrarClick(Sender: TObject);
  61. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  62. procedure fcImageBtnMinimizarClick(Sender: TObject);
  63. procedure fcImageBtnMouseEnter(Sender: TObject);
  64. procedure fcImageBtnMouseLeave(Sender: TObject);
  65. procedure LimpiarFiltro(Sender: TObject);
  66. procedure VerTabla(Sender: TObject);
  67. procedure BtnNavImprimirClick(Sender: TObject);
  68. private
  69. FCampoOrden: String;
  70. procedure CrearFiltro;
  71. procedure PrepararQuery;
  72. procedure RefrescarBD;
  73. public
  74. end;
  75. var WTiposDiario: TWTiposDiario;
  76. implementation
  77. uses DM, DMControl, General, Globales, MenuPrincipal;
  78. {$R *.DFM}
  79. const CADENA_MANUAL = 'Seleccione AYUDA si desea obtener más información sobre el problema surgido';
  80. CADENA_BORRADO = 'El tipo de diario seleccionado se encuentra referenciado en algún apunte.';
  81. procedure TWTiposDiario.CrearFiltro;
  82. begin
  83. {$Message Warn 'La instrucción WITH es ofuscadora de código`'}
  84. with TbFiltro, FieldDefs do begin
  85. active := False;
  86. Clear;
  87. Add('BCodigo', ftString, 2, False);
  88. Add('BDescripcion', ftstring, 30, False);
  89. CreateDataSet;
  90. active := True;
  91. append;
  92. FieldByName('BCodigo').AsString := '';
  93. FieldByName('BDescripcion').AsString := '';
  94. end;
  95. end;
  96. procedure TWTiposDiario.PrepararQuery;
  97. begin
  98. {$Message Warn 'La instrucción WITH es ofuscadora de código`'}
  99. with QFichero, ModifySql do begin
  100. Close;
  101. Clear;
  102. Add('UPDATE TIPODIARIO SET DESCRIPCION = :DESCRIPCION,');
  103. Add('TIPODIARIO = :TIPODIARIO WHERE TIPODIARIO = :OLD_TIPODIARIO');
  104. end;
  105. {$Message Warn 'La instrucción WITH es ofuscadora de código`'}
  106. with QFichero, SelectSQL do begin
  107. DisableControls;
  108. Close;
  109. Clear;
  110. Add('SELECT * FROM TIPODIARIO');
  111. if TbFiltro.FieldByName('BCODIGO').AsString <> '' then begin
  112. add('WHERE TIPODIARIO LIKE :TIPODIARIO');
  113. end
  114. else
  115. if TbFiltro.FieldByName('BDESCRIPCION').AsString <> '' then begin
  116. add('WHERE UPPER(DESCRIPCION) LIKE UPPER(:DESCRIPCION)');
  117. end;
  118. if FCampoOrden <> '' then begin
  119. Add('ORDER BY ' + FCampoOrden);
  120. end;
  121. if TbFiltro.FieldByName('BCODIGO').AsString <> '' then begin
  122. params.byname('TIPODIARIO').AsString :=
  123. Copy(TbFiltro.FieldByName('BCODIGO').AsString + '%', 1,
  124. TbFiltro.FieldByName('BCODIGO').Size);
  125. end
  126. else
  127. if TbFiltro.FieldByName('BDESCRIPCION').AsString <> '' then begin
  128. Params.byname('DESCRIPCION').AsString :=
  129. Copy(TbFiltro.FieldByName('BDESCRIPCION').AsString + '%', 1,
  130. TbFiltro.FieldByName('BDESCRIPCION').Size);
  131. end;
  132. Prepare;
  133. Open;
  134. EnableControls;
  135. end;
  136. end;
  137. procedure TWTiposDiario.RefrescarBD;
  138. begin
  139. FibQueryRefresh(DmRef.QTipoDiario);
  140. FibQueryRefresh(DmRef.QTipodiarioNom);
  141. end;
  142. procedure TWTiposDiario.BtnNavAniadirClick(Sender: TObject);
  143. begin
  144. if not DmControlRef.PermisoUsuario(gvID_Usuario, UpperCase(Self.Name), ANIADIR) then begin
  145. Exit;
  146. end;
  147. Navegador.Visible := False;
  148. eCodigo.SetFocus;
  149. try
  150. QFichero.Insert;
  151. except
  152. DatabaseError('No se ha podido insertar un nuevo tipo de diario.' + #13 +
  153. CADENA_MANUAL);
  154. end;
  155. Modo(Self, Edita);
  156. end;
  157. procedure TWTiposDiario.BtnNavBorrarClick(Sender: TObject);
  158. begin
  159. if not DmControlRef.PermisoUsuario(gvID_Usuario, UpperCase(Self.Name), BORRAR) then begin
  160. Exit;
  161. end;
  162. if not QFichero.IsEmpty then begin
  163. if MessageDlg('?Desea borrar este tipo de diario?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
  164. try QFichero.Delete;
  165. QFichero.Transaction.CommitRetaining;
  166. RefrescarBD;
  167. except DatabaseError('No se ha podido borrar el tipo de diario seleccionado.' + #13 + CADENA_BORRADO);
  168. end;
  169. end;
  170. end;
  171. end;
  172. procedure TWTiposDiario.BtnNavImprimirClick(Sender: TObject);
  173. begin
  174. if not DmControlRef.PermisoUsuario(gvID_Usuario, UpperCase(Self.Name), IMPRESION) then begin
  175. Exit;
  176. end;
  177. FormPrincipal.LanzarListado('LTiposDiario.rtm', SFichero);
  178. end;
  179. procedure TWTiposDiario.BtnEdtGuardarClick(Sender: TObject);
  180. var
  181. ha_insertado: Boolean;
  182. begin
  183. // Comprobamos si el usuario ha insertado un nuevo registro.
  184. ha_insertado := QFichero.State = dsInsert;
  185. // Pasamos al siguiente registro para que el ultimo campo se guarde correctamente
  186. Perform(wm_NextDlgCtl, 0, 0);
  187. if QFichero.FieldByName('TIPODIARIO').AsString = '' then begin
  188. eCodigo.SetFocus;
  189. DatabaseError('No se puede dejar el código del tipo de diario en blanco.' +
  190. #13 + 'Por favor, revise los datos de entrada.');
  191. end;
  192. if QFichero.FieldByName('DESCRIPCION').AsString = '' then begin
  193. eDescripcion.SetFocus;
  194. DatabaseError('No se puede dejar la descripción del tipo de diario en blanco.' +
  195. #13 + 'Por favor, revise los datos de entrada.');
  196. end;
  197. QFichero.Post;
  198. QFichero.Transaction.CommitRetaining;
  199. RefrescarBD;
  200. Navegador.Visible := True;
  201. Modo(Self, Naveg);
  202. Rejilla.SetFocus;
  203. if ha_insertado then begin
  204. if not (TbFiltro.State in dsEditModes) then begin
  205. TbFiltro.Edit;
  206. end;
  207. TbFiltro.FieldByName('BCODIGO').AsString := QFicheroTIPODIARIO.AsString;
  208. PrepararQuery;
  209. LimpiarFiltro(Sender);
  210. end;
  211. end;
  212. procedure TWTiposDiario.BtnEdtCancelarClick(Sender: TObject);
  213. begin
  214. Perform(wm_NextDlgCtl, 0, 0);
  215. if not QFichero.Modified then Exit;
  216. if MessageDlg('?Quiere anular las modificaciones realizadas a este tipo de diario?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
  217. Navegador.Visible := True;
  218. try QFichero.Cancel;
  219. except DatabaseError('No se ha podido cancelar la operación.' + #13 + CADENA_MANUAL);
  220. end;
  221. Modo(Self, Naveg);
  222. end;
  223. end;
  224. procedure TWTiposDiario.RejillaDblClick(Sender: TObject);
  225. begin
  226. if not DmControlRef.PermisoUsuario(gvID_Usuario, UpperCase(Self.Name), MODIFICAR) then begin
  227. Exit;
  228. end;
  229. if not QFichero.IsEmpty then begin
  230. Navegador.Visible := False;
  231. try QFichero.Edit;
  232. except MessageDlg('No se puede editar el registro seleccionado.' + #13 + CADENA_MANUAL, mtInformation, [mbOK], 0);
  233. end;
  234. Modo(Self, Edita);
  235. eCodigo.SetFocus;
  236. end;
  237. end;
  238. procedure TWTiposDiario.FormKeyPress(Sender: TObject; var Key: Char);
  239. begin
  240. // Si pulsamos enter y el control actual no es un grid pasamos al siguiente
  241. // control
  242. if (Key = Chr(VK_RETURN)) then begin
  243. // Comprobacion del filtro por código
  244. if (FiltroBCodigo.Focused) and (FiltroBCodigo.Text <> '') then begin
  245. key := #0;
  246. if tbFiltro.State in dsEditModes then begin
  247. tbFiltro.Post;
  248. end;
  249. PrepararQuery;
  250. end
  251. // Comprobacion del filtro por descripción
  252. else
  253. if (FiltroBDescripcion.Focused) and (FiltroBDescripcion.Text <> '') then begin
  254. key := #0;
  255. if tbFiltro.State in dsEditModes then begin
  256. tbFiltro.Post;
  257. end;
  258. PrepararQuery;
  259. end
  260. //Si no es ninguno de los otros dos pasamos al siguiente control
  261. else
  262. if (not (ActiveControl is TwwDBGrid)) then begin
  263. Key := #0;
  264. SelectNext(ActiveControl, GetKeyState(vk_Shift) and $80 = 0, True);
  265. end;
  266. end;
  267. end;
  268. procedure TWTiposDiario.FormShow(Sender: TObject);
  269. begin
  270. SetBounds(0, FormPrincipal.Panel1.Top + FormPrincipal.Panel1.Height + 1, Width, Height);
  271. FiltroBCodigo.SetFocus;
  272. end;
  273. procedure TWTiposDiario.FormCreate(Sender: TObject);
  274. begin
  275. ActivarTransacciones(self);
  276. CrearFiltro;
  277. FCampoOrden := 'TIPODIARIO';
  278. PrepararQuery;
  279. Modo(Self, Naveg);
  280. end;
  281. procedure TWTiposDiario.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  282. begin
  283. case key of
  284. VK_ESCAPE: begin
  285. key := 0;
  286. if QFichero.State in dsEditModes then begin
  287. BtnEdtCancelar.Click;
  288. end
  289. else begin
  290. BtnNavCerrar.Click;
  291. end;
  292. end;
  293. VK_SPACE: begin
  294. if (ActiveControl <> FiltroBCodigo) and
  295. (ActiveControl <> FiltroBDescripcion) and not
  296. (QFichero.State in dsEditModes) then begin
  297. //Anulamos el evento de la tecla
  298. Key := 0;
  299. RejillaDblClick(Self);
  300. end;
  301. end;
  302. VK_F2: begin
  303. if not (QFichero.State in dsEditModes) then begin
  304. BtnNavAniadir.Click;
  305. end;
  306. end;
  307. VK_F3: begin
  308. if QFichero.State in dsEditModes then begin
  309. BtnEdtGuardar.Click;
  310. end;
  311. end;
  312. VK_F4: begin
  313. if not (QFichero.State in dsEditModes) then begin
  314. RejillaDblClick(Self);
  315. end;
  316. end;
  317. VK_UP: begin
  318. if not (ActiveControl is TwwDBGrid) then begin
  319. SelectNext(ActiveControl, not (GetKeyState(VK_SHIFT) and $80 = 0), True);
  320. end;
  321. end;
  322. VK_DOWN: begin
  323. if not (ActiveControl is TwwDBGrid) then begin
  324. SelectNext(ActiveControl, GetKeyState(VK_SHIFT) and $80 = 0, True);
  325. end;
  326. end;
  327. VK_F12: begin
  328. if not (QFichero.State in dsEditModes) then begin
  329. VerTabla(Sender);
  330. end;
  331. end;
  332. end;
  333. end;
  334. procedure TWTiposDiario.RejillaTitleButtonClick(Sender: TObject; AFieldName: String);
  335. begin
  336. if (UpperCase(AFieldName) = 'DESCRIPCION') or (UpperCase(AFieldName) = 'TIPODIARIO') then begin
  337. FCampoOrden := UpperCase(AFieldName);
  338. PrepararQuery;
  339. end;
  340. Rejilla.SetFocus;
  341. end;
  342. procedure TWTiposDiario.RejillaCalcTitleAttributes(Sender: TObject; AFieldName: String;
  343. AFont: TFont; ABrush: TBrush; var ATitleAlignment: TAlignment);
  344. begin
  345. if (UpperCase(AFieldName) = UpperCase(FCampoOrden)) then begin
  346. ABrush.Color := clBlue;
  347. AFont.Style := [fsBold];
  348. AFont.Color := clWhite;
  349. end;
  350. end;
  351. procedure TWTiposDiario.BtnNavCerrarClick(Sender: TObject);
  352. begin
  353. Close;
  354. end;
  355. procedure TWTiposDiario.FormClose(Sender: TObject; var Action: TCloseAction);
  356. begin
  357. if QFichero.State = dsBrowse then begin
  358. Action := caFree;
  359. Formulario.Free;
  360. Formulario := nil;
  361. WTiposDiario := nil;
  362. end
  363. else begin
  364. MessageBeep(0);
  365. Abort;
  366. end;
  367. end;
  368. procedure TWTiposDiario.fcImageBtnMinimizarClick(Sender: TObject);
  369. begin
  370. windowState := wsminimized;
  371. end;
  372. procedure TWTiposDiario.fcImageBtnMouseEnter(Sender: TObject);
  373. begin
  374. (Sender as TfcImageBtn).Image.LoadFromFile(gvDirImagenes + gcBtnBlanco);
  375. end;
  376. procedure TWTiposDiario.fcImageBtnMouseLeave(Sender: TObject);
  377. begin
  378. (Sender as TfcImageBtn).Image.LoadFromFile(gvDirImagenes + gcBtn);
  379. end;
  380. procedure TWTiposDiario.LimpiarFiltro(Sender: TObject);
  381. begin
  382. if not (TbFiltro.state in dseditmodes) then begin
  383. TbFiltro.edit;
  384. end;
  385. TbFiltro.FieldByName('BCODIGO').AsString := '';
  386. TbFiltro.FieldByName('BDESCRIPCION').AsString := '';
  387. end;
  388. procedure TWTiposDiario.VerTabla(Sender: TObject);
  389. begin
  390. {$Message Warn 'La instrucción WITH es ofuscadora de código`'}
  391. with TbFiltro do begin
  392. Edit;
  393. FieldByName('BCODIGO').AsString := '';
  394. FieldByName('BDESCRIPCION').AsString := '';
  395. Post;
  396. end;
  397. PrepararQuery;
  398. end;
  399. end.