[Info-vax] Calling $CREPRC in COBOL

VAXman- at SendSpamHere.ORG VAXman- at SendSpamHere.ORG
Sun Jul 10 19:57:00 EDT 2022


In article <62ca1a22$0$707$14726298 at news.sunsite.dk>, =?UTF-8?Q?Arne_Vajh=c3=b8j?= <arne at vajhoej.dk> writes:
>On 7/9/2022 8:06 PM, Arne Vajhøj wrote:
>> On 7/4/2022 10:34 AM, seasoned_geek wrote:
>>> On Sunday, July 3, 2022 at 7:22:57 PM UTC-5, Arne Vajhøj wrote:
>>>> On 7/3/2022 4:05 PM, seasoned_geek wrote:
>>>>> On Thursday, June 23, 2022 at 9:14:07 AM UTC-5, osuv... at gmail.com 
>>>>> wrote:
>>>>>> On Tuesday, June 21, 2022 at 12:08:21 AM UTC-4, Dave Froble wrote:
>>>>> At any rate, there is no SQL that will let you put multi-typed
>>>>> records in a table. The "best" you could hope for is to have the
>>>>> primary key fields then a BLOB object one had to hack like we did in
>>>>> BASIC. You would be right back to CVT$% and RSET logic. (Didn't they
>>>>> drop RSET and LSET from the DEC BASIC specification at some point?)
>>>> Not true.
>>>>
>>>> You define a super class and sub classes and your ORM framework
>>>> transparently stores and retrieved the different classes.
>>>>
>>>> That is basic persistence knowledge. Any young developer would
>>>> know that.
>>>
>>> Well, we will ask Dave to post the TOLAS invoice (or order) record 
>>> layouts for a defunct
>>> customer and you create a functioning VAX BASIC program using SQLite 
>>> along with Superclass
>>> and Subclass and post it here.
>> 
>> It is techniques used by hundreds of thousands maybe millions of
>> applications.
>> 
>> VMS Basic would be a problem as I am not aware of any ORM
>> framework for VMS Basic.
>> 
>> (and I also suspect that VMS Basic would need some new features
>> to be able to create a good one)
>
>But let me show something. Not TOLAS - just hello world level.
>
>Obvious choices would be Java + Hibernate, C# + Entity Framework
>or PHP + Doctrine, but since Groovy and Basic are part of the
>thread then Groovy + Hibernate and VB.NET + Entity Framework.
>
>Database definition and a few rows:
>
>CREATE TABLE p (
>     id INTEGER NOT NULL,
>     typ INTEGER NOT NULL,
>     PRIMARY KEY(id)
>);
>CREATE TABLE c1 (
>     id INETGER NOT NULL,
>     ival INTEGER,
>     PRIMARY KEY(id)
>);
>CREATE TABLE c2 (
>     id INETGER NOT NULL,
>     sval VARCHAR(50),
>     PRIMARY KEY(id)
>);
>INSERT INTO p VALUES(1, 1);
>INSERT INTO c1 VALUES(1, 123);
>INSERT INTO p VALUES(2, 2);
>INSERT INTO c2 VALUES(2, 'ABC');
>
>First Groovy + Hibernate.
>
>What is needed:
>* Java
>* Groovy
>* Hibernate
>* SQLite dialect for Hibernate version
>* JDBC driver for SQLite
>
>Data classes:
>
>package mt
>
>import javax.persistence.*
>
>// parent class
>@Entity @Inheritance(strategy=InheritanceType.JOINED)
>class P {
>     @Id int id
>     int typ
>}
>
>// child class 1
>@Entity @PrimaryKeyJoinColumn(name="id")
>class C1 extends P {
>     @Id int id
>     int ival
>     @Override String toString() {
>         return "C1: $id -> $ival"
>     }
>}
>
>// child class 2
>@Entity @PrimaryKeyJoinColumn(name="id")
>class C2 extends P {
>     @Id int id
>     String sval
>     @Override String toString() {
>         return "C2: $id -> $sval"
>     }
>}
>
>Config file with database connection:
>
><persistence xmlns="http://java.sun.com/xml/ns/persistence"
>              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>              xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
>http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
>              version="2.0">
>    <persistence-unit name="testdb">
>       <provider>org.hibernate.ejb.HibernatePersistence</provider>
>       <class>mt.P</class>
>       <class>mt.C1</class>
>       <class>mt.C2</class>
>       <exclude-unlisted-classes/>
>       <properties>
>           <!--<property name="show_sql" value="true"/>-->
>           <property name="hibernate.connection.driver_class" 
>value="org.sqlite.JDBC"/>
>           <property name="hibernate.connection.url" 
>value="jdbc:sqlite:test.db"/>
>           <property name="hibernate.connection.username" value=""/>
>           <property name="hibernate.connection.password" value=""/>
>           <property name="hibernate.dialect" 
>value="org.sqlite.hibernate.dialect.SQLiteDialect"/>
>       </properties>
>    </persistence-unit>
></persistence>
>
>And it is all ready.
>
>Demo:
>
>package mt
>
>import java.util.logging.*
>
>import javax.persistence.*
>
>// disable logging
>Logger.getLogger("org.hibernate").setLevel(Level.OFF)
>// open connection
>emf = Persistence.createEntityManagerFactory("testdb")
>em = emf.createEntityManager()
>// add a C1 and C2
>em.getTransaction().begin()
>em.persist(new C1(id:3, typ:1, ival:456))
>em.persist(new C2(id:4, typ:2, sval:"DEF"))
>em.getTransaction().commit()
>// find by PK
>println(em.find(P.class, 2))
>// list all
>for(o in em.createQuery("SELECT o FROM P AS o", P.class).getResultList()) {
>     println("${o}")
>}
>// list all C2
>for(o in em.createQuery("SELECT o FROM C2 AS o", P.class).getResultList()) {
>     println("${o}")
>}
>// list some
>for(o in em.createQuery("SELECT o FROM P AS o WHERE o.id BETWEEN 2 and 
>3", P.class).getResultList()) {
>     println("${o}")
>}
>// close connection
>em.close()
>emf.close()
>
>Note that: this should run on VMS Itanium as all the pieces
>needed are available.
>
>Now VB.NET + Entity Framework.
>
>What is needed:
>* .NET
>* Entity Framework
>* ADO.NET provider for SQLite (includes Entity Framework support)
>
>Data classes:
>
>Imports System
>Imports System.ComponentModel.DataAnnotations
>Imports System.ComponentModel.DataAnnotations.Schema
>Imports System.Data.Entity
>
>Namespace MT
>     ' parent class
>     <Table("P")> Public Class P
>         <Key> <DatabaseGenerated(DatabaseGeneratedOption.None)> Public 
>Property Id() As Integer
>         Public Property Typ() As Integer
>     End Class
>     ' child class 1
>     <Table("C1")> Public Class C1
>         Inherits P
>         Public Property Ival() As Integer
>         Public Overrides Function ToString() As String
>             Return $"C1: {id} -> {ival}"
>         End Function
>     End Class
>     ' child class 2
>     <Table("C2")> Public Class C2
>         Inherits P
>         Public Property Sval() As String
>         Public Overrides Function ToString() As String
>             Return $"C2: {id} -> {sval}"
>         End Function
>     End Class
>     ' database context
>     Public Class TestDbContext
>         Inherits DbContext
>         Public Sub New(constrkey As String)
>             MyBase.New(constrkey)
>         End Sub
>         Public Property P() As DbSet(Of P)
>         Public Property C1() As DbSet(Of C1)
>         Public Property C2() As DbSet(Of C2)
>     End Class
>End Namespace
>
>Config file with database connection:
>
><?xml version="1.0" encoding="utf-8"?>
><configuration>
>     <configSections>
>         <section name="entityFramework" 
>type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, 
>EntityFramework" requirePermission="false" />
>     </configSections>
>     <connectionStrings>
>         <add name="TestDB" connectionString="Data Source=.\test.db" 
>providerName="System.Data.SQLite"/>
>     </connectionStrings>
>     <entityFramework>
>         <providers>
>             <provider invariantName="System.Data.SQLite" 
>type="System.Data.SQLite.EF6.SQLiteProviderServices, 
>System.Data.SQLite.EF6"/>
>             <provider invariantName="System.Data.SQLite.EF6" 
>type="System.Data.SQLite.EF6.SQLiteProviderServices, 
>System.Data.SQLite.EF6"/>
>         </providers>
>     </entityFramework>
>     <startup>
>         <supportedRuntime version="v4.0" 
>sku=".NETFramework,Version=v4.5.1" />
>     </startup>
>     <system.data>
>         <DbProviderFactories>
>              <remove invariant="System.Data.SQLite" />
>              <remove invariant="System.Data.SQLite.EF6" />
>              <add name="SQLite Data Provider (Entity Framework 6)" 
>invariant="System.Data.SQLite.EF6" description=".NET Framework Data 
>Provider for SQLite (Entity Framework 6)" 
>type="System.Data.SQLite.EF6.SQLiteProviderFactory, 
>System.Data.SQLite.EF6" />
>              <add name="SQLite Data Provider" 
>invariant="System.Data.SQLite" description=".NET Framework Data Provider 
>for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
>         </DbProviderFactories>
>     </system.data>
></configuration>
>
>And it is all ready.
>
>Demo:
>
>Imports System
>Imports System.Data.Entity
>Imports System.Linq
>
>Namespace MT
>     Public Class Program
>         Public Shared Sub Main(args As String())
>             ' open and close connection
>             Using ctx As TestDbContext = new TestDbContext("TestDB")
>                 ' add a C1 and C2
>                 ctx.P.Add(New C1 With { .Id = 3, .Typ = 1, .Ival = 456 })
>                 ctx.P.Add(New C2 With { .Id = 4, .Typ = 2, .Sval = "DEF" })
>                 ctx.SaveChanges
>                 ' find by PK
>                 Console.WriteLine((From o In Ctx.P Where o.Id = 2 
>Select o).FirstOrdefault)
>                 ' list all
>                 For Each ox In (From o In Ctx.P Select o)
>                     Console.WriteLine(ox)
>                 Next
>                 ' list all C2
>                 For Each ox In (From o In Ctx.C2 Select o)
>                     Console.WriteLine(ox)
>                 Next
>                 ' list some
>                 For Each ox In (From o In Ctx.P Where 2 <= o.Id  And 
>o.Id <= 3 Select o)
>                     Console.WriteLine(ox)
>                 Next
>             End Using
>         End Sub
>     End Class
>End Namespace
>
>Arne

... and here I thought that barely a read-only lingo COBOL was verbose.

I still remember when comp.os.vms would see actual "code" posted to it.

-- 
VAXman- A Bored Certified VMS Kernel Mode Hacker    VAXman(at)TMESIS(dot)ORG

I speak to machines with the voice of humanity.



More information about the Info-vax mailing list