ࡱ;   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry  B^$WTextStarWriter 4.0  . SBX sb Z Standard StarBASICSBX ARSBX AR SBX AR2c%bqqSfxDocumentInfo k0$ David Prieto m0Rd David Prieto m0]9RmJ`z NcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierZx%%$ [declaraciones variables globales]9Rm7U  - G c #=VqNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierUZ funciones9RmNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierKZ4 [forms]9RmNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierUZ [reports]9RmNTimes New Roman;Times Ntimes NTimes New Roman;Times NcourierNTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NtimesNTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NtimesNTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Z443En uno de los mdulos debe haber una funcin llamada YT ;sXJK" 1   K 7$`PmNTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times # NTimes New Roman;Times NtimesNTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times <'main'. ?p@|NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times P  La funcin MRbQNTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times #C% NTimes New Roman;Times NtimesNTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times -%main )nNTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Z' es la que se M_XThNTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times !! ejecuta al iniciarse el programa.rGS6n(2d , H NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NcourierNcourierNTimes New Roman;Times NcourierNcourierNcourierNcourierNcourierNTimes New Roman;Times Ntimes NTimes New Roman;Times NcourierNTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times ZUUTSi el programa accede a una base de datos, ser necesario especificar el nombre de la NJI9 vLD 3   r Z :2Z&^@~Qg3&sW'3 !!j""P##NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times @;;:misma en la primera lnea del programa, mediante la lnea 'D_ |'G~>*dU {  ] ' & m 1pJ7}SB{mNcourierNcourierNTimes New Roman;Times NcouriernDATABASE '0L| "<XNTimes New Roman;Times Ntimes NTimes New Roman;Times NcourierNTimes New Roman;Times ^&'NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Nhelvetica, NhelveticahNhelvetica, NTimes New Roman;Times Nhelvetica, Nhelvetica, NhelveticahNhelvetica, Nhelvetica, Nhelvetica, NhelveticahNhelvetica, Nhelvetica, Nhelvetica, NTimes New Roman;Times Ntimes NTimes New Roman;Times Nhelvetica, NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NtimesNTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times Nhelvetica, NhelveticahNhelvetica, NTimes New Roman;Times Nhelvetica, P# ComentariosHkNTimes New Roman;Times Ntimes NTimes New Roman;Times Nhelvetica, NTimes New Roman;Times Z%VVUSe pueden incluir comentarios dentro de los programas para que su cdigo sea ms fcil ebG2Ftug } A 0 ! { e *oURc8HdF W0&o65ho4 m !!"b""###NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times _& de comprender. ?0\ xNTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times # & NTimes New Roman;Times NtimesNTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times 2 &hy4GL rNTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times &KKJ permite introducir los comentarios entre llaves, en el estilo de Informix-4^MKJRd^\a  % W U x?H1|N X,tm;DMNTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times 9(ZZY4GL o bien entre caracteres /* y */, al estilo de C. El compilador detecta los comentarios x;6]UAU$I i  8 / *Et@+`]`]!{m {|A-rFg !l!!"###9$$$7%NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times l)TTSanidados e ignora todo el cdigo que encuentra entre las marcas de inicio y final de m$FFe^ s U 7 7 j ~qZ?FO;d9idYe$\ 1!!T"""_##B$$7%NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times P* comentario.m:?NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times NTimes New Roman;Times Ntimes NTimes New Roman;Times NTimes New Roman;Times (ZJ,Ej:NcourierNcourierNTimes New Roman;Times NcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierZ-{Funcion: suma_totales; 0Lj %>Yv  # A NcourierNcourierNcourierNcourier!- NcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierZ/&&% calcula el importe total de una fra.}3N| +D]x  6 L f BX #NcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierZw0function suma_totales()0L| "<Xv  # A NcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierZ1++*define j integer /* j lo uso para bucles */0]| "<X  6 U u BX&@mNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierZ33 /* ya no necesito esta variable.9]| "<X  - U o 1ONcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierZ4//.define suma integer /* para ir calculando... */0]w+D]x  6 U o #=aw<Zx:NcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourier#Z5*/NcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourierNcourier(ZM7...NhelveticaNhelveticaNhelveticaNcourierNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticav>110hy4GL: compilador de lenguaje 4GL para PostgreSQL rDC5\7+eD  E o w  y =wns#JNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelveticaNhelvetica#*v>2-nNhelveticaNhelveticaNhelveticaNhelvetica+v>1K,<K,< Info 0 Info 1 Info 2 Info 3 k0$<44Standard LIBIMBEDDED LIBIMBEDDED32,max,2268;696867;138;779;694418;12007;702711;0;0,1Oh+'0 h t 7@\M@a۽@SWG, A<  #$%&'()*./0123456789:;<=>?@ABCDGHK  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFQRSTU0!'@yX'@ starbats helveticacourier helvetica helveticaoXX!X5XGX[' @ oddBs,dxdZddU @dXXXX&X.X6X>XFXNXV' @XX'@X'@ XX'@5X+'$(@aXXX7'%@X'( @ =n, , , j, , , , , , %, %,.$,.q#,.V",. ;!,.XXX;XGXZXmXyXXX@'1L@rdrddrddd7d7dd7ddd6ddd6ddd7ddd'ddd'ddd ddd dd d ddd QdddQ ldddlXX!X4XGXZXmXXXXXXXXA'2Z@rdrddxddxdddxdxdXXX&X2X>5'4@?X7S;$@kXX8S<4@XXX"9S=&@XX'?D@-XX'('@v@UXXQXgR'D@X4Nv$Ct*jn}P$' '( , @ , , , , !, `', -, 2, @8, =, 6')j 2  * Internet link Internet link!''Bullet SymbolsBullet Symbols''Numbering SymbolsNumbering SymbolsOLEOLE;7S<8S=9S>> FormulaFormula1@'<8S>> FrameFrame1@'2A';7S<8S=9S>>@(' StandardStandard@HeadingStandard Text body@''2A'?'DR'  Text bodyStandard Text body@2A' Heading 1HeadingText body indent@''('?'  Heading 2Heading Text body@' ''('?' Text body indent Text bodyText body indent@$+'1@'CitationStandardCitation1@'2A'0Horizontal LineStandardHorizontal Line'2A'@('0 Heading 3HeadingText body indent@''%7'('45'?'  Heading 4HeadingText body indent@' ''?' FuenteText body indentFuente''$+'(' Marginalia Text body Marginalia1@'IndexStandardIndex@ Index 2IndexIndex 21@' Table Contents Text bodyTable Contents@'Hanging indent Text bodyHanging indent('1@'First line indent Text bodyFirst line indent1@'Punto2Text body indentPunto2('1@'HeaderStandardHeader@'''('FooterStandardFooter@'' ''('@('CaptionStandardCaption' '2A' Heading 5HeadingText body indent@''?'FootnoteStandardFootnote@'1@'  Index HeadingHeading Index Heading' '1@'  List Indent Text body List Indent('1@'  Table HeadingTable Contents Table Heading@' ''$+'Frame contents Text bodyFrame contents  SalutationStandard SalutationUser Index HeadingHeadingUser Index Heading' '1@'  User Index 1Index User Index 1('1@'  Contents HeadingHeadingContents Heading@' '1@'  Contents 1Index Contents 1@('1@'  Contents 2Index Contents 2@('1@'  Contents 3Index Contents 3@('1@' Contents 4Index Contents 4@('1@'  Contents 5Index Contents 5@(' 1@'  RdA2'hgF2t l D % h JĶ۽@Mtڽ David PrietoSW4HDR.m0lRd!  Frameformat ZeichenformatTextformatvorlageStandard Heading Text body  Heading 1  Heading 2Text body indent0Citation0Horizontal Line  Heading 3  Heading 4Fuente Marginalia Index Index 2Table ContentsHanging indentFirst line indentPunto2HeaderFooterCaption Heading 5 Footnote Index Heading List Indent Table Heading Frame contents Salutation User Index Heading User Index 1 Contents Heading Contents 1 Contents 2 Contents 3 Contents 4 Contents 5 Internet linkBullet SymbolsNumbering Symbols OLE Formula FrameLine-FrmFmt 46 Box-FrmFmt 47 Box-FrmFmt 48 Box-FrmFmt 49 Box-FrmFmt 50 Box-FrmFmt 51 Box-FrmFmt 52 Box-FrmFmt 53 Box-FrmFmt 54 Box-FrmFmt 55 Box-FrmFmt 56 Box-FrmFmt 57 Box-FrmFmt 58 Box-FrmFmt 59 Box-FrmFmt 60 Box-FrmFmt 61 Box-FrmFmt 62 Box-FrmFmt 63 Box-FrmFmt 64 Box-FrmFmt 65 Box-FrmFmt 66 Box-FrmFmt 67 Box-FrmFmt 68 Box-FrmFmt 69 Box-FrmFmt 70 Box-FrmFmt 71 Box-FrmFmt 72 Box-FrmFmt 73 Box-FrmFmt 74 Box-FrmFmt 75 Box-FrmFmt 76 Box-FrmFmt 77 Box-FrmFmt 78 Box-FrmFmt 79 Box-FrmFmt 80 Box-FrmFmt 81 Box-FrmFmt 82 Box-FrmFmt 83 Box-FrmFmt 84 Box-FrmFmt 85 Box-FrmFmt 86 Box-FrmFmt 87 Box-FrmFmt 88 Box-FrmFmt 89 Box-FrmFmt 90 Box-FrmFmt 91 Box-FrmFmt 92 Box-FrmFmt 93 Box-FrmFmt 94 Box-FrmFmt 95 Box-FrmFmt 96 Box-FrmFmt 97 Box-FrmFmt 98 Box-FrmFmt 99Box-FrmFmt 100Box-FrmFmt 101Box-FrmFmt 102Box-FrmFmt 103Box-FrmFmt 104Box-FrmFmt 105Box-FrmFmt 106Box-FrmFmt 107Box-FrmFmt 108Box-FrmFmt 109Box-FrmFmt 110Line-FrmFmt 111Box-FrmFmt 112Box-FrmFmt 113Box-FrmFmt 114Box-FrmFmt 115Box-FrmFmt 116Box-FrmFmt 117Box-FrmFmt 118Box-FrmFmt 119Box-FrmFmt 120Box-FrmFmt 121Box-FrmFmt 122Box-FrmFmt 123Box-FrmFmt 124Box-FrmFmt 125Box-FrmFmt 126Box-FrmFmt 127Box-FrmFmt 128Box-FrmFmt 129Box-FrmFmt 130Box-FrmFmt 131Box-FrmFmt 132Box-FrmFmt 133Box-FrmFmt 134Box-FrmFmt 135Box-FrmFmt 136Box-FrmFmt 137Box-FrmFmt 138Box-FrmFmt 139Box-FrmFmt 140Box-FrmFmt 141Box-FrmFmt 142Box-FrmFmt 143Box-FrmFmt 144Box-FrmFmt 145Box-FrmFmt 146Box-FrmFmt 147Box-FrmFmt 148Box-FrmFmt 149Box-FrmFmt 150Box-FrmFmt 151Box-FrmFmt 152Box-FrmFmt 153Box-FrmFmt 154Box-FrmFmt 155Box-FrmFmt 156Box-FrmFmt 157Box-FrmFmt 158Box-FrmFmt 159Box-FrmFmt 160Box-FrmFmt 161Box-FrmFmt 162Box-FrmFmt 163Box-FrmFmt 164Box-FrmFmt 165Box-FrmFmt 166Box-FrmFmt 167Box-FrmFmt 168Box-FrmFmt 169Box-FrmFmt 170Box-FrmFmt 171Box-FrmFmt 172Box-FrmFmt 173Box-FrmFmt 174Box-FrmFmt 175Root 176 Table1 177 Table2 178Standard  Illustration Table Textq6 StandardStandardd #.##0 CCC#.##0 CCC$ DD/MM/YYYYDD/MM/YYYYStandardStandardd #.##0,00 CCC#.##0,00 CCC TT.MM.JJJJTT.MM.JJJJBj|~j~Pp 2$:: SAP.AAPndnddnAPndndAPrHeaderSAP.APdddAPddA0PN'T Manual de UsuarioAPA PrFooterSAP.APdddAP ddAsPNjT TV6hy4GL: compilador de lenguaje 4GL para PostgreSQL 2-A05APA PAPd%ShAP.AAPndnddnAPndndA PAPd%ZSW4HDR.m0lRdC (SV364]DAddress bookaddress!  Frameformat ZeichenformatTextformatvorlageStandard Heading Text body  Heading 1  Heading 2Text body indent0Citation0Horizontal Line  Heading 3  Heading 4Fuente Marginalia Index Index 2Table ContentsHanging indentFirst line indentPunto2HeaderFooterCaption Heading 5 Footnote Index Heading List Indent Table Heading Frame contents Salutation User Index Heading User Index 1 Contents Heading Contents 1 Contents 2 Contents 3 Contents 4 Contents 5 Internet linkBullet SymbolsNumbering Symbols OLE Formula FrameLine-FrmFmt 46 Box-FrmFmt 47 Box-FrmFmt 48 Box-FrmFmt 49 Box-FrmFmt 50 Box-FrmFmt 51 Box-FrmFmt 52 Box-FrmFmt 53 Box-FrmFmt 54 Box-FrmFmt 55 Box-FrmFmt 56 Box-FrmFmt 57 Box-FrmFmt 58 Box-FrmFmt 59 Box-FrmFmt 60 Box-FrmFmt 61 Box-FrmFmt 62 Box-FrmFmt 63 Box-FrmFmt 64 Box-FrmFmt 65 Box-FrmFmt 66 Box-FrmFmt 67 Box-FrmFmt 68 Box-FrmFmt 69 Box-FrmFmt 70 Box-FrmFmt 71 Box-FrmFmt 72 Box-FrmFmt 73 Box-FrmFmt 74 Box-FrmFmt 75 Box-FrmFmt 76 Box-FrmFmt 77 Box-FrmFmt 78 Box-FrmFmt 79 Box-FrmFmt 80 Box-FrmFmt 81 Box-FrmFmt 82 Box-FrmFmt 83 Box-FrmFmt 84 Box-FrmFmt 85 Box-FrmFmt 86 Box-FrmFmt 87 Box-FrmFmt 88 Box-FrmFmt 89 Box-FrmFmt 90 Box-FrmFmt 91 Box-FrmFmt 92 Box-FrmFmt 93 Box-FrmFmt 94 Box-FrmFmt 95 Box-FrmFmt 96 Box-FrmFmt 97 Box-FrmFmt 98 Box-FrmFmt 99Box-FrmFmt 100Box-FrmFmt 101Box-FrmFmt 102Box-FrmFmt 103Box-FrmFmt 104Box-FrmFmt 105Box-FrmFmt 106Box-FrmFmt 107Box-FrmFmt 108Box-FrmFmt 109Box-FrmFmt 110Line-FrmFmt 111Box-FrmFmt 112Box-FrmFmt 113Box-FrmFmt 114Box-FrmFmt 115Box-FrmFmt 116Box-FrmFmt 117Box-FrmFmt 118Box-FrmFmt 119Box-FrmFmt 120Box-FrmFmt 121Box-FrmFmt 122Box-FrmFmt 123Box-FrmFmt 124Box-FrmFmt 125Box-FrmFmt 126Box-FrmFmt 127Box-FrmFmt 128Box-FrmFmt 129Box-FrmFmt 130Box-FrmFmt 131Box-FrmFmt 132Box-FrmFmt 133Box-FrmFmt 134Box-FrmFmt 135Box-FrmFmt 136Box-FrmFmt 137Box-FrmFmt 138Box-FrmFmt 139Box-FrmFmt 140Box-FrmFmt 141Box-FrmFmt 142Box-FrmFmt 143Box-FrmFmt 144Box-FrmFmt 145Box-FrmFmt 146Box-FrmFmt 147Box-FrmFmt 148Box-FrmFmt 149Box-FrmFmt 150Box-FrmFmt 151Box-FrmFmt 152Box-FrmFmt 153Box-FrmFmt 154Box-FrmFmt 155Box-FrmFmt 156Box-FrmFmt 157Box-FrmFmt 158Box-FrmFmt 159Box-FrmFmt 160Box-FrmFmt 161Box-FrmFmt 162Box-FrmFmt 163Box-FrmFmt 164Box-FrmFmt 165Box-FrmFmt 166Box-FrmFmt 167Box-FrmFmt 168Box-FrmFmt 169Box-FrmFmt 170Box-FrmFmt 171Box-FrmFmt 172Box-FrmFmt 173Box-FrmFmt 174Box-FrmFmt 175Root 176 Table1 177 Table2 178Standard  Illustration Table Textd+N!0n'n'n'n'n'1 j) stardiv.dic standard.dicypxlTable of ContentsIndice <#> <#> <#> <#> <#>!"#$%&NXaTaManual de UsuarioSA dA @A)8 Table of ContentsTNSintaxis del lenguaje 4GL.A)8 Table of ContentsTAl igual que un programa en C, un programa en 4GL consta de uno o varios mdulos en los que se definen variables, funciones, formularios de entrada y listados. La estructura de cada mdulo ser la siguiente:T  [DATABASE ]T0 % [declaraciones variables globales]T funcionesT [forms]T [reports]T T{En uno de los mdulos debe haber una funcin llamada 'main'. La funcin main es la que se ejecuta al iniciarse el programa.A8 5<A8 <HA8 HLA8 L{TSi el programa accede a una base de datos, ser necesario especificar el nombre de la misma en la primera lnea del programa, mediante la lnea 'DATABASE 'SA  A8courierTSA  T? ComentariosA)8 Table of ContentsTqSe pueden incluir comentarios dentro de los programas para que su cdigo sea ms fcil de comprender. hy4GL permite introducir los comentarios entre llaves, en el estilo de Informix-4GL o bien entre caracteres /* y */, al estilo de C. El compilador detecta los comentarios anidados e ignora todo el cdigo que encuentra entre las marcas de inicio y final de comentario.A8fkA8 fkTEj:T# {Funcion: suma_totales; T1 & calcula el importe total de una fra.}T" function suma_totales()T6 +define j integer /* j lo uso para bucles */T+ /* ya no necesito esta variable.T: /define suma integer /* para ir calculando... */T  */T ...T  T^Declaraciones de variables:SA PA)8 Table of ContentsTC Tipos de datos:A)8 Table of ContentsTH= El lenguaje soporta los siguientes tipos de datos bsicos:T*IntegerSAPddd6Rn0.starbats( n0.starbats( n0.starbats(Q Qn0.starbats(l n0.starbats( TEl rango permitido para nmeros enteros es el de un 'long int' de C. Depender de la plataforma en la que se est trabajando. En Linux, usando gcc 2.7, el rango es entre -2.147.483.647 y 2.147.483.648A8 5=A8 =T(FloatSAPddd6Rn0.starbats( n0.starbats( n0.starbats(Q Qn0.starbats(l n0.starbats( TEste tipo permite usar nmeros reales. Se implementa mediante el tipo de datos 'double' de C, por lo que la precisin depender del compilador de C usado.A8 PVA8 VT*Char(x)SAPddd6Rn0.starbats( n0.starbats( n0.starbats(Q Qn0.starbats(l n0.starbats( TPermite usar cadenas de caracteres. No hay lmite para el tamao de la cadena. A diferencia del lenguaje C, no es necesario reservar un carcter para la marca de fin de cadena puesto que lo reserva el compilador automticamente.TqfSe puede omitir la longitud de la cadena. En este caso, la variable tendr una longitud de 1 carcter.TuEn este tipo de datos slo se podrn almacenar caracteres imprimibles. No est pensado para almacenar datos binarios.A8 :EA8 EuT'DateSAPddd6Rn0.starbats( n0.starbats(6 n0.starbats(Q n0.starbats(l n0.starbats( TPara almacenar fechas. Se permiten fechas desde el 1de Enero del ao 1 (d.C.) hasta bien pasado el ao 40.000 (creo que con esto no habr problemas en el 2000).T'TimeSAPddd6Rn0.starbats( n0.starbats( n0.starbats(Q Qn0.starbats(l n0.starbats( TPEPermite almacenar horas con precisin hasta las milsimas de segundo.TAunque el tipo de datos permite almacenar la hora con esa precisin, las milsimas de segundo se pierden al realizar operaciones aritmticas. T+DatetimeSAPddd6Rn0.starbats( n0.starbats( n0.starbats(Q Qn0.starbats(l n0.starbats( TAlmacena un instante, representado por fecha y hora. Las caractersticas comentadas en los dos tipos anteriores son aplicables a ste.T+IntervalSAPddd6Rn0.starbats( n0.starbats( n0.starbats(Q Qn0.starbats(l n0.starbats( TAlmacena un intervalo de tiempo, representado por un nmero de horas, minutos y segundos. La diferencia entre dos 'datetimes' es un intervalo.A8 s|A8 |T TAdems de los tipos de datos bsicos, se permite definir registros, formados por campos de tipos bsicos. No se permite que un campo de un registro sea, a su vez, otro registro.T T\ Declaracin de variables:SA PA)8 Table of ContentsT{8Como en cualquier lenguaje de programacin, hy4GL permite definir variables en las que se almacenarn los datos con los que se est trabajando. hy4GL es un lenguaje tipado: cada variable es de un tipo determinado, aunque se ver ms adelante que el propio lenguaje realiza la conversin de tipos automticamente.A8,1A8 ,1A8A8 TEl nombre de las variables debe empezar por una letra o un signo de subrayado '_', y puede contener cualquier combinacin de letras, nmeros y signos '_'.TEl mbito de una variable depende de la parte del mdulo en la que se declare. As, si una variable se declara dentro de una funcin, ser visible (se podr acceder a su contenido) solamente desde dentro de esa misma funcin. Si la variable se declara fuera de una funcin, ser visible desde cualquier funcin de este mdulo. No es posible usar en un mdulo una variable que est declarada en otro mdulo distinto.TF;La sintaxis de la declaracin de variables es la siguiente:T*  DEFINE [,,...] T TEj:T define i integerT define hora timeT define hoy,ayer dateT  define ahora datetimeT+ define nombre,apellidos char(50)T define tecla charT  TSi la aplicacin accede a bases de datos, es posible definir variables del mismo tipo que determinado campo de una tabla en la base de datos. La sintaxis para ello es:T+ DEFINE LIKE .T TmPara ello es necesario que se haya indicado el nombre de la base de datos en la instruccin DATABASE A8\mcourierTEj:T  database contabilidadT, !define cuenta like cuentas.numeroT, !define importe like mayor.importeT iTEs posible definir registros que agrupen varias variables en una sola estructura. Para definir un registro se usar la siguiente sintaxis:SA PT DEFINE RECORD T  T  ...T END RECORDTPara acceder a un campo de un registro se especificar el nombre del registro y el del campo separados por un punto. Para referirse a la lista completa de campos de un registro, se usar el nombre del registro seguido de '.*'TEj:T  define cliente recordT  codigo integerT  nombre char(50)T  apellidos char(50)T end recordT$ let cliente.nombre="JUAN"T6 +let cliente.*=busca_cliente(cliente.nombre)T  TbWSe puede definir un registro con la misma estructura que una tabla de la base de datos:T, !DEFINE RECORD LIKE .*TjPor supuesto, ser necesario haber indicado el nombre de la base de datos mediante la instruccin DATABASEA8bjcourierTEj:T  database contabilidadT) define reg record like mayor.*T, !define rcta record like cuentas.*T TM Funciones:SA PA)8 Table of ContentsTA6Las funciones se declararn con la siguiente sintaxis:T4 )FUNCTION ( [par1 [,par2,...]] ) TH/ declaraciones variables locales y parmetrosA8 /T& sentenciasSA  T END FUNCTIONT TSi la funcin rebice parmetros, se relacionarn los nombres de los parmetros formales entre los parntesis. Hay que tener en cuenta que los parmetros habr que declararlos dentro de la funcin, junto con las variables locales, si las hubiera.T TEj:T+ function graba_registro(r,donde)T* define r record like clientes.*T  define donde char(20)T$  if donde="clientes" thenT. # insert into clientes values (r.*)T  else T0 % insert into proveedores values(r.*)T  end ifT end functionT TY2La funcin main, es una excepcin. Su sintaxis es:A8  A8 2TSA  T MAINT;" declaraciones variables localesSA  T& sentenciasSA  T END MAINT TILa funcin main es, como se coment anteriormente, la primera funcin que se ejecuta al lanzar la aplicacin. La variable global arg_count indica el nmero de parmetros que se han enviado al programa, y la funcin arg_val(i) devuelve el parmetro nmero i. Al igual que en C, el parmetro nmero cero es el nombre del programa.A8  A8 A8 A8 A8 A8 A8 ITSA  T'Ej:SA PA  T mainT  define param char(50)T  if arg_count=0 thenT< 1 display "Error. Numero de parametros erroneo."T  exit programT  end ifT   let param=arg_val(1)T  ...T end mainTSA  TZUna funcin puede devolver varios parmetros usando la sentencia return, cuya sintaxis es:A8 AGA8 GZTC 8RETURN [[,[,....]]]T TjEl lenguaje soporta recursividad sin que exista ms lmites que los impuestos por el compilador de C usadoSA  TEj:SA  T  function factorial(n)T define n integerT if n=0 thenT return 1T  elseT&  return n*(factorial(n-1))T  end ifT end functionTP Expresiones:SA PA)8 Table of ContentsT Expresiones simples:TX1hy4GL soporta las siguientes expresiones simples:A8A8 T'SAPdddT+ VariableSAPddd6Rn0.starbats( n0.starbats(6 n0.starbats(Q n0.starbats(l n0.starbats( TBasta con indicar el nombre de la variable. El tipo de la expresin ser el mismo que el tipo de la variable. La variable debe ser de un tipo bsico, no permitindose para este tipo de expresiones nombres de registros.TEj:T  define a integerT, ! define r record like clientes.*T display aT  display r.nombreT) NmeroSAPddd6Rn0.starbats( n0.starbats(6 n0.starbats(Q n0.starbats(l n0.starbats( TBSe pueden usar nmeros enteros o reales. Para indicar decimales se usa el punto '.' y no se deben usar separadores para los miles. Si el nmero no lleva el punto decimal, la expresin ser de tipo entero, mientras que ser de tipo float en caso de llevarlo.A8courierA8courierTEj:T display 4T display 4.5T T) CadenaSAPddd6Rn0.starbats( n0.starbats(6 n0.starbats(Q n0.starbats(l n0.starbats( TyUSe expresarn las cadenas entre comillas dobles "". La expresin ser de tipo cadena.A84UtimesT'Ej:SAtimesT4display "Error."SAtimesTH$display "No se encuentra el cliente"SAtimesT&SAcourierT: Operadores USING, CLIPPED y [ ]:SA PT Operador USINGTZEl operador USING convierte una expresin numrica al formato especificado en la mscara. A8 courierT T'La sintaxis es la siguiente:T" expresion USING mascaraT TLa mscara consistir en una serie de caracteres '-','#','&',',' y '.'. La mscara es aplicada a la expresin numrica, devolviendo una cadena en la que los caracteres '-','#' y '&' son sustituidos por los dgitos correspondientes. El smbolo '#' es usado para rellenar con espacios a la izquierda; el smbolo '-' rellena tambin con espacios, excepto en la primera posicin en la que no haya dgtos, que ser sustituida por el signo '-' en caso de que el nmero sea negativo. El smbolo '&' se usa para rellenar con ceros las posiciones correspondientes. Los signos ',' se usan para separar los miles y el '.' para indicar la posicin del punto decimalTEj:T- "0 using "##,###.##" -> " . "T2 '10.23 using "##,###.##" -> " 10.23"T4 )1123.23 using "##,###.##" -> " 1,123.23"T4 )-1123.23 using "&&,&&&.&&" -> "01,123.23"T4 )-1123.23 using "--,--&.&&" -> "-1,123.23"T  T Operador CLIPPEDTEl operador CLIPPED corta los espacios finales de una cadena. La expresin resultante es una nueva cadena. Su sintaxis es la siguiente:A8 courierT expresion CLIPPEDTEj:T( let nombre= "JUAN "T  let apellidos="PEREZ"TG <let nomape=nombre+apellidos /* nomape="JUAN PEREZ" */TG <let nomape=nombre clipped+apellidos /* nomape="JUANPEREZ" */TJ ?let nomape=nombre clipped+" "+apellidos /* nomape="JUAN PEREZ*/T T& Operador [ ]SA PTEl operador [ ] permite obtener una subcadena a partir de una expresin. La nueva expresin resultante es de tipo cadena. Su sintaxis es la siguiente:T expresion[i,j]T expresion[i]T TEntre los corchetes se indicarn la posicin de inicio y final de la subcadena que se desea obtener. Se puede omitir la posicin de final, con lo que se tomar la subcadena que comienza y termina en la posicin 'i'.TEj:T define ccc char(20)T* define entidad,sucursal char(4)T define dc1,dc2 charT! define cuenta char(10)TH =prompt "Introduzca su numero de cuenta (20 digitos) " for cccT let entidad=ccc[1,4]T  let sucursal=ccc[5,8]T let dc1=ccc[9]T let dc2=ccc[10]T  let cuenta=ccc[11,20]T iT. Llamadas a funcionesSA PTLos valores devueltos por una funcin son usados como expresiones. El tipo de estas expresiones depender del tipo de los valores devueltos por la funcin.TEj:T define hora timeTJ ?let hora=time() /* la funcion time() devuelve la hora actual */T  T Operadores binariosTLos siguientes operadores transforman dos expresiones en una nueva expresin. El tipo de la expresin resultante depender de los tipos de las expresiones originales.T Operador +T*Este operador toma dos expresiones y devuelve una nueva expresin, resultado de sumar las dos expresiones originales. El significado de sumar depende del tipo de las expresiones originales. En el siguiente cuadro se detalla el comportamiento de este operador:A8 A8 TSA  EG"%@fJS?AP%APdddAPL-f-SA Ptx.f\.SQAPA9P7NT +t/f\/SQAPA9P7N(TChar T"10"t0f\0SQAPA9P7N*TInteger T(5)t1f\1SQAPA9P7N)TFloatT(5.5)t2f\2SQAPA9P7N/TDateT (10/12/1998)t3f\3SQAPA9P7N- TTimeT (10:10:05)t4f\4SQAPA9P7N< TDatetimeT (10/12/1998 10:10:05)t5fk5S`AP'AHP7N3 TIntervalT (123:10:20)L1-t~6fM6SBAPA*P7N* TChar T("10")t}7fM7SBAPA*P7N) TCharT"1010"t|8fM8SBAPA*P7N(TCharT"105"t~9fM9SBAPA*P7N*TCharT(105.5"t:fM:SBAPA*P7N1TCharT"1010-12-1998"t;fM;SBAPA*P7N/TCharT "1010:10:05"t<fM<SBAPA*P7NDTCharT "1010-12-1998T 10:10:05"t=f\=SQAP'A9P7N0TCharT "10123:10:20"L'-t~>fM>SBAPA*P7N*TInteger T(5)t|?fM?SBAPA*P7N(TCharT"510"t|@fM@SBAPA*P7N(TIntegerT 10t|AfMASBAPA*P7N(TFloatT10.5tBfMBSBAPA*P7N-TDateT 15/12/1998tCfMCSBAPA*P7N+TTimeT10:10:10tDfMDSBAPA*P7NETDatetimeT 10-12-1998T 10:10:10"tEf\ESQAP'A9P7N0TIntervalT 123:10:25L*-t~FfMFSBAPA*P7N*TFloat T(5.5)tGfMGSBAPA*P7N-TCharT "5.500010"t|HfMHSBAPA*P7N(TFloatT10.5tzIfMISBAPA*P7N&TFloatT 11tJfMJSBAPA*P7N- TDateT 15/12/1998tKfMKSBAPA*P7N+!TTimeT10:10:10tLfMLSBAPA*P7NE"TDatetimeT 10-12-1998T 10:10:10"tMf\MSQAP'A9P7N0#TIntervalT 123:10:25L-tNfMNSBAPA*P7N0$TDateT (10-12-1998)tOfMOSBAPA*P7N1%TCharT"10-12-199810"tPfMPSBAPA*P7N-&TDateT 15-12-1998tQfMQSBAPA*P7N-'TDateT 15-12-1998ttRfMRSBAPA*P7N (T No permitidotSfMSSBAPA*P7ND)TDatetimeT 10-12-1998T10:10:05ttTfMTSBAPA*P7N *T No permitidotUf\USQAP'A9P7N +T No permitidoL-tVfMVSBAPA*P7N.,TTime T (10:10:05)tWfMWSBAPA*P7N3-TCharT"10:10:05.00010"tXfMXSBAPA*P7N+.TTimeT10:10:10tYfMYSBAPA*P7N+/TTimeT10:10:10tZfMZSBAPA*P7ND0TDatetimeT 10-12-1998T10:10:05tt[fM[SBAPA*P7N 1T No permitidott\fM\SBAPA*P7N 2T No permitidot]f\]SQAP'A9P7N+3TTimeT13:20:25L^-t^fM^SBAPA*P7NH4T Datetime T (10-12-1998 T 10:10:05)t_fM_SBAPA*P7N<5TCharT$10-12-1998 10:10:05.00010t`fM`SBAPA*P7ND6TDatetimeT 10-12-1998T10:10:10tafMaSBAPA*P7ND7TDatetimeT 10-12-1998T10:10:10ttbfMbSBAPA*P7N 8T No permitidottcfMcSBAPA*P7N 9T No permitidottdfMdSBAPA*P7N :T No permitidotef\eSQAP'A9P7N:;TDatetimeT15-12-1998 13:20:25L:-tffMfSBAPA*P7N3<T Interval T (123:10:20)tgfMgSBAPA*P7N0=TCharT 123:10:20.010thfMhSBAPA*P7N0>TIntervalT 123:10:25tifMiSBAPA*P7N0?TIntervalT 123:10:25ttjfMjSBAPA*P7N @T No permitidotkfMkSBAPA*P7N+ATTimeT13:20:25tlfMlSBAPA*P7NDBTDatetimeT 15-12-1998T13:20:25tmf\mSQAP'A9P7N0CTIntervalT 246:20:40TSA  T Operador -TDevuelve la expresin resultante de calcular la diferencia entre las dos expresiones originales. El comportamiento de este operador, as como el tipo de la expresin resultante depende de las expresiones originales:TSA  E %@DfJS?AP%APdddAPLnfnSA Ptxof\oSQAPA9P7NET -tpf\pSQAPA9P7N(FTChar T"10"tqf\qSQAPA9P7N*GTInteger T(5)trf\rSQAPA9P7N)HTFloatT(5.5)tsf\sSQAPA9P7N/ITDateT (10/12/1998)ttf\tSQAPA9P7N-JTTimeT (10:10:05)tuf\uSQAPA9P7N<KTDatetimeT (10/12/1998 10:10:05)tvfkvS`AP'AHP7N3LTIntervalT (123:10:20)Lnt~wfMwSBAPA*P7N*MTChar T("10")ttxfMxSBAPA*P7N NT No permitidottyfMySBAPA*P7N OT No permitidottzfMzSBAPA*P7N PT No permitidott{fM{SBAPA*P7N QT No permitidott|fM|SBAPA*P7N RT No permitidott}fM}SBAPA*P7N ST No permitidot~f\~SQAP'A9P7N TT No permitidoLnt~fMSBAPA*P7N*UTInteger T(5)t|fMSBAPA*P7N(VTIntegerT -5t{fMSBAPA*P7N'WTIntegerT 0t|fMSBAPA*P7N(XTFloatT-0.5ttfMSBAPA*P7N YT No permitidottfMSBAPA*P7N ZT No permitidottfMSBAPA*P7N [T No permitidotf\SQAP'A9P7N \T No permitidoLnt~fMSBAPA*P7N*]TFloat T(5.5)t|fMSBAPA*P7N(^TFloatT-4.5t{fMSBAPA*P7N'_TFloatT0.5tyfMSBAPA*P7N%`TFloatT 0ttfMSBAPA*P7N aT No permitidottfMSBAPA*P7N bT No permitidottfMSBAPA*P7N cT No permitidotf\SQAP'A9P7N dT No permitidoL)ntfMSBAPA*P7N0eTDateT (10-12-1998)ttfMSBAPA*P7N fT No permitidotfMSBAPA*P7N,gTDateT 5-12-1998tfMSBAPA*P7N-hTDateT 15-12-1998tfMSBAPA*P7NDiTIntegerT 0Tdiferencia en diasttfMSBAPA*P7N jT No permitidotfMSBAPA*P7NDkTIntegerT 0Tdiferencia en diastf\SQAP'A9P7N lT No permitidoLntfMSBAPA*P7N.mTTime T (10:10:05)ttfMSBAPA*P7N nT No permitidotfMSBAPA*P7N+oTTimeT10:10:00tfMSBAPA*P7N+pTTimeT10:10:10ttfMSBAPA*P7N qT No permitidotfMSBAPA*P7N+rTTimeT00:00:00ttfMSBAPA*P7N sT No permitidotf\SQAP'A9P7N+tTTimeT06:59:45LyntfMSBAPA*P7NHuT Datetime T (10-12-1998 T 10:10:05)ttfMSBAPA*P7N vT No permitidotfMSBAPA*P7NDwTDatetimeT 10-12-1998T10:10:00tfMSBAPA*P7NDxTDatetimeT 10-12-1998T10:10:00tfMSBAPA*P7N/yTIntervalT10:10:05tfMSBAPA*P7N:zTDatetimeT10-12-1998 00:00:00tfMSBAPA*P7N/{TIntervalT00:00:00tf\SQAP'A9P7N9|TDatetimeT5-12-1998 06:59:45LntfMSBAPA*P7N3}T Interval T (123:10:20)ttfMSBAPA*P7N ~T No permitidotfMSBAPA*P7N0TIntervalT 123:10:15tfMSBAPA*P7N0TInterval