Uli Merkel The Hitchhiker`s Guide to the UNIFACE 0811 - uli
Transcript
Uli Merkel The Hitchhiker`s Guide to the UNIFACE 0811 - uli
Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 Uli Merkel Don't Panic ! The Hitchhiker's Guide to the UNIFACE 0811 Texts may be shortened, but there is always a link to the original article. 1 NEEDFUL LINKS ........................................................................................................................................ 2 1.1 1.2 1.3 2 DITO DO IT OURSELF: WWW.ULI-MERKEL.DE WWW.UNIFACE.INFO.................................... 3 2.1 2.2 3 081130: HOW DO I DEBUG THE UAS (UROUTER) .................................................................................... 8 UNIFACE LISTSERVER ............................................................................................................................ 9 5.1 5.2 5.3 6 081128: PRINTOUT TO CLIENT WITH FORMS RUNNING ON THE SERVER ................................................... 4 081124: XML CPY FROM U9 TO U8........................................................................................................ 4 081124: UNIFACE AND PDF .................................................................................................................... 5 UNIFACE COMMUNITY "UNIFACE.INFO"........................................................................................ 8 4.1 5 081120: DITO-NAVIGATE IDF WITH SHORTCUTS-BASICS ....................................................................... 3 081123: 8.2.02 3GL SAMPLE OWIWRAP............................................................................................... 3 T.U.R.F........................................................................................................................................................... 4 3.1 3.2 3.3 4 THINK BEFORE YOU CODE ..................................................................................................................... 2 AGILE SOFTWARE DEVELOPMENT:........................................................................................................... 2 LEARNING WHILE HAVING FUN:............................................................................................................... 2 081125: PRINTING WITH COLOR IN U9 ..................................................................................................... 9 081120: PRE-DISCLOSING THE BIG CU2008 SURPRISE IN AMSTERDAM ................................................... 9 081124: GETTING THE VALUE OF A WINDOWS ENVIRONMENT VARIABLE FROM WITHIN U8.................. 10 FRONTLINE............................................................................................................................................... 11 6.1 6.2 6.3 081124: PRINTING WITH COLOR ............................................................................................................. 11 081119: UNIFACE USP WEB DEVELOPMENT .......................................................................................... 11 081119: COMPILATION CONSTANT TO DETERMINE FROM WHICH LEVEL IS CODE COMING FROM IN ENTITY OPERATIONS ....................................................................................................................................................... 12 ume_hhgu_0811.doc 04.12.2008 11:30 1 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 1 Needful Links A collection of Links you may find useful, interesting, funny, strange, ... 1.1 THINK before you Code 1.1.1 http://oracleplsqlprogramming.com/ by Steven Feuerstein (PL/SQL evangelist) 1.1.2 http://www.qcgu.net/about_it.php OK, it is PL/SQL, but get the message behind the language 1.1.3 http://www.pragmaticprogrammer.com just something to fight the cruel reality 1.2 Agile Software development: 1.2.1 http://www.agilemodeling.com A lot of valuable documents by Scott W. Ambler with a lot of practicable practices. Very interesting: http://www.agilemodeling.com/essays/agileDocumentation.htm 1.3 Learning while having Fun: 1.3.1 http://www.setgame.com/set/puzzle_frame.htm (each day another puzzle) Recommenden by Steven Feuerstein, will sharpen your eyes for patterns and sets. 1.3.2 http://www.nytimes.com/ref/crosswords/setpuzzle.html More exercises each day, different levels -- will be continued -- ume_hhgu_0811.doc 04.12.2008 11:30 2 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 2 dITo do IT ourself: www.uli-merkel.de www.uniface.info DITO do IT ourself a contribution for the UnifAce Community 2.1 081120: dITo-Navigate IDF with shortcuts-Basics dITo-Navigate IDF with shortcuts-Basics.pdf (145 KB) Open or Download fast access to the IDF editors more on dITo on www.uli-merkel.de, discussion forum at http://reinmeindevelopment.forumup.de 2.2 081123: 8.2.02 3GL sample OWIWRAP owiwrap.zip (131 KB) Open or Download ume_hhgu_0811.doc 04.12.2008 11:30 3 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 3 T.U.R.F. Source: "http://hosted.byjones.net/turf/" T.U.R.F. 3.1 081128: Printout to client with Forms running on the server http://hosted.byjones.net/turf/viewtopic.php?f=2&t=1022 Posted: 28.11.08 13:10 by petemonk For speed, our application runs frms as reports on the server. Thus the output ends up on the server. We then manually transfer the output back to the client using FTP. Is there any other way where we could get this output back to the client without using FTP... maybe an assignment or something? Posted: 29.11.08 09:52 by Uli with the ASN, you can access files over the $NET. So if the server is "aware" of the client (= different ASN for each client) you may redirect the print-output to a directory on your client. 3.2 081124: XML Cpy from U9 to U8 http://hosted.byjones.net/turf/viewtopic.php?f=2&t=1018 Posted: 24.11.08 17:46 by Andrea Di Ceglie I use to copy from an Uniface 8.4 (called A) application to another uniface 8.4 one (Called B), using /CPY and XML file A -> /cpy DEF:entity.model XML:c:\pippo.xml B -> /cpy XML:c:\pippo.xml DEF: Now A is migrated to U92. Xml file generated from U92 seems to be not compatible with U8, so when i try to import data into U8 I got a "not well formed XML" error. Removing the invalid Tag "UNIFACE.DTD", I got another incompatibility error. "Xml file generated from different Uniface version" Anyone knows if exists a Map file or a method to Exporting data from U9 into XML and importing to U8 ? Posted: 25.11.08 08:37 by Uli If you have a look at the generated XML files of V8 and V9, you see the difference. in V9, they use "XMLengine 2.0". So the UNIFACE.DTD is different in V8 and V9. I do not have access to a V8 or V9 environment right now, but this may help you: To load the XML, you have to bring to your V8 environment the V9 DTD (!). ume_hhgu_0811.doc 04.12.2008 11:30 4 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 3.3 081124: Uniface and PDF http://hosted.byjones.net/turf/viewtopic.php?f=2&t=995 Posted: 08.10.08 11:35 by Michel_33 I'am searching the way to generate PDF documents with uniface 7.2 Is someby have an idea ? Posted: 08.10.08 16:02 by Bignon Pour votre problème, il faut : Utiliser un script ( Jscript par exemple) pour transcrire vos documents DOC ou RTF en Ps ( postcript), les concaténer éventuellement entre eux pour sortir un fichier txt final. Ensuite utiliser Ghostscript pour transformer le txt final ( concaténé ou pas) en PDF. Vous pouvez même transformer des fichiers XLS, JPG, BMP concaténés à des fichiers DOC, RTF pour n'avoir qu'un PDF final. J'ai développé ça chez un client ... Et ça marche !!!! Posted: 19.11.08 13:08 by Andrea Di Ceglie We are Usinge Pdf creator 9.5 via Com interface. Is free, it works. Posted: 19.11.08 17:57 by Bignon M. Andrea Di Ceglie, Your solution with PdfCreator is interesting and seems more easier than mine. Could you give me an example and the com signature definitions ? DOC -> PDF directly ? We use RTF format, it's ok too. Posted: 20.11.08 10:45 by Uli another option is to install a PDF "printer" (like FreePDF) and create a logical printer for uniface. This has minimal changes inside the uniface code, but the freepdf has to be installed on all sites. One scenario I know prints from a server machine and distributes PDFs (via eMail etc). Posted: 21.11.08 10:26 by Firesong We take the very long way around and use Crystal Reports to generate all our ume_hhgu_0811.doc 04.12.2008 11:30 5 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 documents, as the display is more controllable than Uniface, and we talk to Crystal directly via com. Posted: 24.11.08 17:37 by Andrea Di Ceglie Pdf Signature has a very long definition. You can loadit doing so: 1)Install Pdf creator >=9.5 (with MsVista >= 9.6) Define new signature ->Implementation -> COM -> Properties ->ProgId= PDFCreator.clsPDFCreator Press Generate new Signature Save and Compile 2) Define a LogicalPrinter Called "PDF" pointing to PDF_CREATOR physical printer (for U9 I deploy it using a .reg file) This is a sample of proc Code to enable silent, autosave file to a certain directory (C:\) using $formTitle.pdf ad file Name. v_pdfh=gf_instance_std("PDFCREATOR_STD","randominame=1","") v_pdfh->CSTART("","","") v_pdfh->SET_COPTION("AUTOSAVEDIRECTORY","c:\") v_pdfh->SET_COPTION("AUTOSAVEFILENAME","<Title>") v_pdfh->SET_COPTION("AUTOSAVEFORMAT","0") v_pdfh->SET_COPTION("USEAUTOSAVE","1") v_pdfh->SET_COPTION("USEAUTOSAVEDIRECTORY","1") v_pdfh->CSAVEOPTIONS("") print "PDF","C" .Reg File For U9 (Just save it as PDF_STD_9.reg then double click it) Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Compuware\Uniface\USYS9\PRT_PDF_STD] "DEVMODE"=hex:50,00,44,00,46,00,43,00,72,00,65,00,61,00,74,00,6f,00,72,00,00 ,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,04,02,05,dc,00,c4,\ 02,53,ef,80,01,01,00,09,00,9a,0b,34,08,64,00,01,00,0f,00,58,02,02,00,01,00,\ 58,02,03,00,00,00,41,00,34,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,02,00,00,00,\ 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,50,\ 52,49,56,e2,30,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,18,00,00,00,00,00,10,27,10,27,10,27,00,\ 00,10,27,00,00,00,00,00,00,00,00,00,00,c4,02,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,00,00,00,00,00,00,10,\ 00,50,34,03,00,28,88,04,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,e7,b1,4b,4c,03,00,00,00,05,00,0a,00,ff,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ ume_hhgu_0811.doc 04.12.2008 11:30 6 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,0 0,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00 "DEVNAMES"=hex:04,00,0d,00,18,00,00,00,77,00,69,00,6e,00,73,00,70,00,6f,00,6 f,\ 00,6c,00,00,00,50,00,44,00,46,00,43,00,72,00,65,00,61,00,74,00,6f,00,72,00,\ 00,00,50,00,44,00,46,00,43,00,72,00,65,00,61,00,74,00,6f,00,72,00,3a,00,00,\ 00,2d,00,20,00,48,00,50,00,20,00,4c,00,61,00,73,00,65,00,72,00,4a,00,65,00,\ 74,00,20,00,34,00,30,00 "DEVMODE_SIZE"=dword:000003a0 ume_hhgu_0811.doc 04.12.2008 11:30 7 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 4 UNIFACE community "UNIFACE.info" Source: " http://www.communityzero.com/uniface" aka "uniface.info" 4.1 081130: How do I debug the UAS (Urouter) Posted by: kiskogl Nov-30-2008 2:23 PM I'm using som services in uniface via UAS. Does anyone here now how to set ut the config to let me debug the server process? From: -GHANReply to: kiskogl [ Message 1 ] in order to debug the URouter you need to raise the IOPRINT setting in your urouter.asn: ----8<-----------------[SETTINGS] $putmess_logfile = C:\USYS9\log\urouter.log $ioprint=255 ----8<-----------------This could look like the above. Simply state $IOPRINT=255 (or whatever Loglevel is desired- see Uniface Help for the details) and define WHERE the logfile has to be saved ($putmess_logfile). After every change restart the urouter and look at the logfile. If this is clean, then change over to the SERVICE Log (i.e. wasv). Do the same in there and keep an eye upon how much is logged. several cases: 1) UROUTER.LOG is written, contains no complains ==> OK, fine, next look at the service-logfile (WASV whatever) 1.1) WASV.LOG is written, looks good! ==> STOP reading further :) 1.2) WASV.LOG is NOT written, crap! ==> seems to be a UROUTER-CAN'T/WON'T-START USERVER.EXE ... look at the assignments (ASN-files aswell as the Tomcat stuff)! After that restart the uROUTER service and start over! 2) UROUTER.LOG is written, some mess is stated ==> Fix that, and afterwards restart services and GOTO "several cases" ... basicly this is it! maybe this is helpfull for you! Be aware of the user (for userver, look at the tomcat web.xml and related stuff) has the fitting rights on the machine! Good luck to you -GHAN(... Has Another Name - NOT!) ume_hhgu_0811.doc 04.12.2008 11:30 8 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 5 UNIFACE Listserver Source: " http://groups.google.com/groups?hl=de&lr=&group=comp.soft-sys.app-builder.uniface" 5.1 081125: printing with color in U9 Von: "Francois Moritz" <[email protected]> Datum: Tue, 25 Nov 2008 13:26:08 +0100 Betreff: Re: [Uniface-L] Re: printing with color in U9 Hi Uli You thought like me. But the documentation says forecolor/backcolor should be printed. I just created a call by Compuware. So as soon I get an answer I'll put it to the userGroup. Thanks to all :-> regards Francois Moritz ITS Management Hewitt Associates Tel +41 32 732 31 11 www.hewitt.com "Ulrich Merkel" <[email protected]> Hi Francois, for me it looks like the "print" is not handled by the widget (with access to all the widget properties) but simply by uniface where only the unifield properties (just like col=nn) are available. So whenever you change forground/background of the widget specify a matching $fieldvideo. Success, Uli 5.2 081120: pre-disclosing the big CU2008 surprise in Amsterdam Datum: 20.11.08 12:23:15 Hi Freaks UnifAce 9.3 is GA :-) But Compuware didn't tell us :-( So if you wan't to test 9.3 ask your local store to send you the UnifAce 9.3 CD. Documentation is avalible on Frontline and there is already a Patch PO01 for UF93. Just a advice: Don't install UF93 in your production-environment but rather install a test-environment. Background: There is a huge change in the "resource localization" and this have impact on your programming and deployment. URR, DOL and other things now in UAR-Files and one have to declare this resources in the ASN-file As I did only a short test, it could be that under default conditions there is an easier way to do so, but we do have a little tricky installation :-)) ume_hhgu_0811.doc 04.12.2008 11:30 9 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 BTW: There is a new function $labelproperty. Now one can change (some) labels at runtime. Ingo 5.3 081124: Getting the value of a Windows environment variable from within U8 Von: "Dave Willford" <[email protected]> Datum: Mon, 03 Nov 2008 15:11:15 -0600 Betreff: [Uniface-L] Getting the value of a Windows environment variable from within U8 We are using Uniface 8.4.06 on running on Windows clients and have a need to get the value of an environment variable that is SET on the workstation. Does anyone have a slick way of doing this other than creating a .pif and calling out to DOS? Example, I would like to know if this environment variable is set in the OS and if so what the value is: ALLUSERSPROFILE Thanks, Dave Willford Integration Analyst Information Technology Services Office of the Chancellor Minnesota State Colleges & Universities Bemidji, MN USA 651 201 1474 Hi Dave Try to use signature: Create a signature (say KERNEL32 Implementation C DLL Name Kernel32) Create an operation GETENVIRONMENTVARIABLE; Literal Name GetEnvironmentVariableA; Return Value in $status (long) Params: NAME INOUT String, BUFFER INOUT String, SIZE INOUT Numeric (long) Compile it and use it as above: variables Handle lv_kernel32 string lv_buffer,lv_name numeric lv_size endvariables lv_name="ALLUSERSPROFILE" newinstance "KERNEL32",lv_kernel32 $status=lv_kernel32->GetEnvironmentVariable(lv_name,lv_buffer,lv_size) in lv_buffer u get your environment variable value. Hope this help. ume_hhgu_0811.doc 04.12.2008 11:30 10 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 6 Frontline Source: "http://forums.compuware.com/forum" (frontline login required) 6.1 081124: printing with color original version of this page can be found at : http://forums.compuware.com/forum/default.aspx?f=41&m=13651 Posted By : hewitt - 11/24/2008 3:14 PM ..Hello we are facing a problem I 've not found any solution nor workaround. We 'd like to print a report or form where some fields are colorised. I tempt to set a color with a specific layout with col(nn) or by proc through the color of the widgets (forecolor/backcolor). Both tests have not reached my goal. It still prints in black and white (onto a colorprinter of course) I temps to examine if it'd be due to a windows issues, it seems not. If I print onto a PDFconverter printer, the pdf does not contain any colorised fields. I tempt to adapt the PRATT as the documentation says. > Define/Edit Print Job Model > Print using colors—prints the Background Color and Foreground Color of a widget if they are defined. Other wise, the Print black on white option is used. But nothing has been changed. The print is still black and white. So my question is : To print a field with his defined color what have I to do ? We are using P_MSWINX or a derived of it. printman /queue=logicalPrinter. Thanks in advance to give ideas or advices 6.2 081119: Uniface USP web development original version of this page can be found at : http://forums.compuware.com/forum/default.aspx?f=41&m=13627 Posted By : manifom - 11/19/2008 1:50 PM I use Uniface web development since 1998 (Uniface web enabler times...) and now i'm migrating my app from 8.4 to 9.2. This operation was smooth from 7 to 8, but in 9 the new server page layout editor not only is a pain to use, but the overall new way of managing the usp structure is very dangerous for the stability of the application. If I simply re-compile the USP, nearly no problem, but if I do some modification (using the new editor... :-( ), in many cases I get the component structure broken (labels disappeared ecc.) Now I'm very very concerned about the direction Uniface is going. Not only for the problem itself, but because is a symptom of confusion about the way decisions are taken. I need to migrate some installation to Uniface 9, but in this situation the risk is to have an application not yet modificable.. Posted By : Merkel34 - 11/20/2008 10:11 AM in www.communityzero.com/uniface there is a discussion about "stable USP editor" with a lot of info about comming-up enhancements on that matter. Posted By : manifom - 11/20/2008 3:34 PM Thank you Uli, I have just read the topic, but is all about uniface 9.4. It will be announced at CU2 in december, will be in GA after a while, and then... 1: wait some months to reach a stable version (6 to 12) 2: wait for some 3rd party release specifics drivers (in my case UD6 from March-Hare) 3:... unfortunately I have the problem right now, and the customer is waiting... ume_hhgu_0811.doc 04.12.2008 11:30 11 / 12 Uli Merkel: The Hitchhiker's Guide to the UNIFACE 0811 6.3 081119: compilation constant to determine from which level is code coming from in entity operations original version of this page can be found at : http://forums.compuware.com/forum/default.aspx?f=41&m=13574 Posted By : incadrv - 11/5/2008 4:29 PM I use collection and occurence operations on entities. Standart operations are added by #include proc on begining of SuperType triggers. They can be overriden on supertype,subtypes or component level. Using this #include proc on level of subtype or component is can cause error in inheritance Is there any compilation constant to determine, from which level is the code coming from ? #define in #include has only local scope <$componetname> are allready defined when I compile form Thanks Vojta Posted By : Merkel34 - 11/6/2008 9:29 AM Unfortunately, uniface does not support info about the inheritance. what about the following option #define codelevel = default #include mycodeblock #undefine codelevel so when you change this on a local trigger, just change codelevel as well #define codelevel = local #include mylocalcodeblock #undefine codelevel Success, Uli Posted By : incadrv - 11/7/2008 12:49 PM Thank you, the bad messege is message to :( Conceptual OccurenceOperationsTrigger ;; default operations of entity ;; #include contains partner operation ;; for example write with basic acces and logging functionality #include system_library:OperOccDef ;; on the next lines user can override operations from system_library:OperOccDef partner operation write ... end LOCAL OccurenceOperationsTrigger ;;It must be redefined and cannot use #include system_library:OperOccDef once more #include system_library:OperOccDef ;;!! error .. operation was overriden back to default code Posted By : Merkel34 - 11/8/2008 8:07 AM the "trick" is to put ALL the conceptual trigger in a single include file and #include this one in the local trigger I use some precompiler constants like <$componentname> and <$entname> for naming the includes P.S. see my article on T.U.R.F.; hosted.byjones.net/turf/viewtopic.php?f=8&t=883&start=0&st=0&sk=t&sd=a ume_hhgu_0811.doc 04.12.2008 11:30 12 / 12