Single stand-alone Full Code

 


The following is our completed Module:




XIncludeFile "../Utils/ThemedMessage.pbi"
XIncludeFile "DB.pbi"

DeclareModule FIGHTERSIZE
  Structure FighterSize
    ID.i                            ; Table Primary Key
    Name.s                          ; FighterSize Name
    UnitDescription.s               ; Short description
    UnitTypeID.i                    ; Foreign Key to Type UnitType
    VisibleWithTechnologyLevelID.i  ; Foreign Key to Table TechnologyLevel
    IsHidden.i                      ; Boolean field
    GameImageID.i                   ; Foreign Key to Table GameImage
    Space.i                         ; the volume of space inside the ship
    ProdCost.i                      ; Cost to Produce
    ProdTime.i                      ; Time it takes to produce in Game turns
    Attack.i                        ; Fighter's attack Value
    Defense.i                       ; Fighter's Definse Value

    State.i
  EndStructure


  Declare LoadComboName(cbData.i)
  Declare LoadListIcon(liData.i)
  Declare.i Init(*Class.FighterSize)
  Declare.i Find(FighterSizeID.i, *Class.FighterSize)
  Declare.i Save(*Class.FighterSize)
  Declare.i Delete(*Class.FighterSize)
  Declare.i Validate(*Class.FighterSize)
  Declare.i DeleteValidate(*Class.FighterSize)

EndDeclareModule

Module FIGHTERSIZE
  EnableExplicit

  Declare Dispose(*Class.FighterSize)
  Declare Init(*Class.FighterSize)

  Procedure Init(*Class.FighterSize)
    With *Class

    Dispose(*Class)

      \ID = 0 
      \Name = ""
      \UnitDescription = ""
      \UnitTypeID = 0 
      \VisibleWithTechnologyLevelID = 0 
      \IsHidden = #False 
      \GameImageID = 0 
      \Space = 0 
      \ProdCost = 0 
      \ProdTime = 0 
      \Attack = 0 
      \Defense = 0 

      \State = DB::#New

    EndWith
  EndProcedure

  Procedure Dispose(*Class.FighterSize)
    ClearStructure(*Class, FighterSize)
  EndProcedure

  Procedure LoadComboName(cbData.i)
    Protected DBID, Sql$ 
      ComboBoxEx::ClearItems(cbData)
      DBID = DB::Open(DBTYPE::#Sqlite)
      Sql$ = " Select "
      Sql$ = Sql$ + " ID, "
      Sql$ = Sql$ + " Name "
      Sql$ = Sql$ + " FROM "
      Sql$ = Sql$ + " FighterSize "
      Sql$ = Sql$ + " ORDER BY "
      Sql$ = Sql$ + " Name "

      If DB::Query(DBID, Sql$)
        While NextDatabaseRow(DBID)
          ComboBoxEx::AddItem(cbData, -1, GetDatabaseString(DBID,DatabaseColumnIndex(DBID,"Name")))
          ComboBoxEx::SetItemData(cbData, ComboBoxEx::CountItems(cbData)-1, GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"ID")))
        Wend
      EndIf
      DB::Close(DBID)

    EndProcedure
  Procedure LoadListViewName(lvData.i)
    Protected DBID, Sql$ 
      ClearGadgeItems(lvData)
      DBID = DB::Open(DBTYPE::#Sqlite)
      Sql$ = " Select "
      Sql$ = Sql$ + " ID, "
      Sql$ = Sql$ + " Name "
      Sql$ = Sql$ + " FROM "
      Sql$ = Sql$ + " FighterSize "
      Sql$ = Sql$ + " ORDER BY "
      Sql$ = Sql$ + " Name "

      If DB::Query(DBID, Sql$)
        While NextDatabaseRow(DBID)
          AddGadgetItem(lvData, -1, GetDatabaseString(DBID,DatabaseColumnIndex(DBID,"Name")))
          SetGadgetItemData(lvData, ComboBoxEx::CountItems(lvData)-1, GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"ID")))
        Wend
      EndIf
      DB::Close(DBID)
  EndProcedure    

  Procedure LoadListIcon(liData.i)
    Protected DBID, Sql$ 
    Protected Result 
      DBID = DB::Open(DBTYPE::#Sqlite)
      ListEx::DisableReDraw(liData, #True) 
      ListEx::ClearItems(liData)
      ListEx::RemoveColumn(liData, 0) ;Name
      ;===== Build Column Titles =====-
      ListEx::AddColumn(liData, 0, "Name", 60)
      ListEx::SetColumnAttribute(liData, 0, ListEx::#Align,  ListEx::#Left)

      Sql$ = " Select "
      Sql$ = Sql$ + "Name, "
      Sql$ = Sql$ + "ID "
      Sql$ = Sql$ + "FROM "
      Sql$ = Sql$ + "FighterSize "
      Sql$ = Sql$ + "ORDER BY "
      Sql$ = Sql$ + "Name "
      ;===== Populate Data Into Column =====
      Result = DB::Query(DBID, Sql$)
      If Result > 0
        While NextDatabaseRow(DBID)
          ListEx::AddItem(liData, -1,GetDatabaseString(DBID, DatabaseColumnIndex(DBID,"Name")) + #LF$ ) 
          ListEx::SetItemData(liData, ListEx::CountItems(liData) -1 , GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"ID")) ) 
        Wend
      EndIf
      DB::Close(DBID)
      ListEx::DisableReDraw(liData, #False) 
  EndProcedure


  Procedure.i Find(FighterSizeID.i, *Class.FighterSize)
    Protected Sql$, DBID, Result, PictureSize, *picture, BLOBSize
    Protected PassFail = #False 

    Init(*Class)

    DBID = DB::Open(DBTYPE::#Sqlite)
    SetDatabaseLong(DBID, 0, FighterSizeID)
    Sql$ = "SELECT "
    Sql$ =  Sql$ + "ID, "
    Sql$ =  Sql$ + "Name, "
    Sql$ =  Sql$ + "UnitDescription, "
    Sql$ =  Sql$ + "UnitTypeID, "
    Sql$ =  Sql$ + "VisibleWithTechnologyLevelID, "
    Sql$ =  Sql$ + "IsHidden, "
    Sql$ =  Sql$ + "GameImageID, "
    Sql$ =  Sql$ + "Space, "
    Sql$ =  Sql$ + "ProdCost, "
    Sql$ =  Sql$ + "ProdTime, "
    Sql$ =  Sql$ + "Attack, "
    Sql$ =  Sql$ + "Defense"
    Sql$ =  Sql$ + " FROM "
    Sql$ =  Sql$ + "FighterSize "
    Sql$ =  Sql$ + " WHERE "
    Sql$ =  Sql$ + "ID = ? "

    PassFail = DB::Query(DBID, Sql$)
    If PassFail 
      While NextDatabaseRow(DBID)
        With *Class
          \ID = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"ID")) 
          \Name = GetDatabaseString(DBID, DatabaseColumnIndex(DBID,"Name")) 
          \UnitDescription = GetDatabaseString(DBID, DatabaseColumnIndex(DBID,"UnitDescription")) 
          \UnitTypeID = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"UnitTypeID")) 
          \VisibleWithTechnologyLevelID = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"VisibleWithTechnologyLevelID")) 
          \IsHidden = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"IsHidden")) 
          \GameImageID = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"GameImageID")) 
          \Space = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"Space")) 
          \ProdCost = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"ProdCost")) 
          \ProdTime = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"ProdTime")) 
          \Attack = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"Attack")) 
          \Defense = GetDatabaseLong(DBID, DatabaseColumnIndex(DBID,"Defense")) 
          \State = DB::#Clean 
        EndWith 
      Wend
    EndIf

    DB::Close(DBID)


    ProcedureReturn PassFail 

  EndProcedure


  Procedure.i Save(*Class.FighterSize)
    Protected Sql$, Result, DBID, Length, *MemoryGraphicID 
    Protected PassFail = #False 

    If Validate(*Class) = #False
      ProcedureReturn #False
    Else 
      DBID = DB::Open() 
      With *Class
        SetDatabaseString(DBID, 0, \Name)
        SetDatabaseString(DBID, 1, \UnitDescription)
        SetDatabaseLong(DBID, 2, \UnitTypeID)
        SetDatabaseLong(DBID, 3, \VisibleWithTechnologyLevelID)
        SetDatabaseLong(DBID, 4, \IsHidden)
        SetDatabaseLong(DBID, 5, \GameImageID)
        SetDatabaseLong(DBID, 6, \Space)
        SetDatabaseLong(DBID, 7, \ProdCost)
        SetDatabaseLong(DBID, 8, \ProdTime)
        SetDatabaseLong(DBID, 9, \Attack)
        SetDatabaseLong(DBID, 10, \Defense)
      EndWith 

      If *Class\State = DB::#New 
        Sql$ = "INSERT "
        Sql$ = Sql$ + " into "
        Sql$ = Sql$ + "FighterSize" 
        Sql$ = Sql$ + " ("
        Sql$ = Sql$ + "      Name, "
        Sql$ = Sql$ + "      UnitDescription, "
        Sql$ = Sql$ + "      UnitTypeID, "
        Sql$ = Sql$ + "      VisibleWithTechnologyLevelID, "
        Sql$ = Sql$ + "      IsHidden, "
        Sql$ = Sql$ + "      GameImageID, "
        Sql$ = Sql$ + "      Space, "
        Sql$ = Sql$ + "      ProdCost, "
        Sql$ = Sql$ + "      ProdTime, "
        Sql$ = Sql$ + "      Attack, "
        Sql$ = Sql$ + "      Defense"
        Sql$ = Sql$ + " )"
        Sql$ = Sql$ + " VALUES "
        Sql$ = Sql$ + " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"

        PassFail = DB::Update(DBID, Sql$)

        If PassFail 
          *Class\State = DB::#Clean
          *Class\ID = DB::getLastID(DBID, "FighterSize")
        EndIf 

    DB::Close(DBID)



      Else ;>>>>>> UPDATE <<<<<<

        SetDatabaseLong(DBID, 11, *Class\ID) 
        Sql$ = "UPDATE "
        Sql$ = Sql$ + "FighterSize "
        Sql$ = Sql$ + "SET "
        Sql$ = Sql$ + "Name = ? , "
        Sql$ = Sql$ + "UnitDescription = ? , "
        Sql$ = Sql$ + "UnitTypeID = ? , "
        Sql$ = Sql$ + "VisibleWithTechnologyLevelID = ? , "
        Sql$ = Sql$ + "IsHidden = ? , "
        Sql$ = Sql$ + "GameImageID = ? , "
        Sql$ = Sql$ + "Space = ? , "
        Sql$ = Sql$ + "ProdCost = ? , "
        Sql$ = Sql$ + "ProdTime = ? , "
        Sql$ = Sql$ + "Attack = ? , "
        Sql$ = Sql$ + "Defense = ? "
        Sql$ = Sql$ + " WHERE "
        Sql$ = Sql$ + "ID = ? "

        PassFail = DB::Update(DBID, Sql$) 

        If PassFail 
          *Class\State = DB::#Clean
        EndIf 

        DB::Close(DBID) 

      EndIf 


    EndIf 

  ProcedureReturn PassFail  

  EndProcedure


  Procedure.i Delete(*Class.FighterSize)
    Protected Result, DBID 
    Protected Sql$ 

    If DeleteValidate(*Class) = #False 
      ProcedureReturn #False 
    Else 

    DBID = DB::Open(DBTYPE::#Sqlite)
    SetDatabaseLong(DBID, 0, *Class\ID) 
    Sql$ = " DELETE "
    Sql$ = Sql$ + "FROM "
    Sql$ = Sql$ + "FighterSize "
    Sql$ = Sql$ + "WHERE "
    Sql$ = Sql$ + "ID = ?  "
    Result = DB::Update(DBID, Sql$) 
    DB::Close(DBID) 
    ProcedureReturn Result 
  EndIf

  EndProcedure


  Procedure.i Validate(*Class.FighterSize)

    Protected DBID, Sql$, PassFail.i = #True 
    Protected ErrMsg.s = ""


    If Len(*Class\Name) < 1 
      PassFail = #False
      ErrMsg = ErrMsg + "Name cannot be less than 1 characters in length!" + #LF$ 
    EndIf
    If Len(*Class\Name) > 50 
      PassFail = #False 
      ErrMsg = ErrMsg + "Name cannot exceed 50 characters!" + #LF$ 
    EndIf 

    ;Unique Check FIELD ==> FighterSize
    If *Class\State = DB::#New  
      DBID = DB::Open(DBTYPE::#Sqlite)
      SetDatabaseString(DBID, 0, *Class\Name)  
      Sql$ = " Select "
      Sql$ = Sql$ + " * "
      Sql$ = Sql$ + " FROM "
      Sql$ = Sql$ + "FighterSize "
      Sql$ = Sql$ + " WHERE "
      Sql$ = Sql$ + "Name = ? "

      If DatabaseQuery(DBID, Sql$)  
        While NextDatabaseRow(DBID) 
          PassFail = #False  
          ErrMsg = ErrMsg + "Name must be unique!" + #LF$  
        Wend  
       EndIf  
      DB::Close(DBID)  
    Else
      DBID = DB::Open(DBTYPE::#Sqlite)
      SetDatabaseString(DBID, 0, *Class\Name) 
      SetDatabaseLong(DBID, 1, *Class\ID) 
      Sql$ = "Select "
      Sql$ = Sql$ + " * "
      Sql$ = Sql$ + " FROM "
      Sql$ = Sql$ + "FighterSize "
      Sql$ = Sql$ + " WHERE "
      Sql$ = Sql$ + "Name = ? "
      Sql$ = Sql$ + " And "
      Sql$ = Sql$ + "ID <> ? "
      If DatabaseQuery(DBID, Sql$) 
        While NextDatabaseRow(DBID) 
          PassFail = #False  
          ErrMsg = ErrMsg + "Name must be unique!" + #LF$  
        Wend 
      EndIf 
      DB::Close(DBID)  
    EndIf  


    If PassFail = #False 
      THEMEDMESSAGE::MessageBox("Validation Error",ErrMsg) 
    EndIf	

    ProcedureReturn PassFail 

  EndProcedure


  Procedure.i DeleteValidate(*Class.FighterSize)
    Protected DBID, Sql$, Cnt, PassFail, ErrMsg.s 
    PassFail.i = #True 
    ErrMsg.s = ""
    DBID = DB::Open(DBTYPE::#Sqlite)
    SetDatabaseLong(DBID, 0, *Class\ID) 
    Sql$ = "SELECT 
    Sql$ = Sql$ + "Name"
    Sql$ = Sql$ + "FROM "
    Sql$ = Sql$ + "Carrier "
    Sql$ = Sql$ + "WHERE "
    Sql$ = Sql$ + "FighterSizeID = ? "

    If DB::Query(DBID, Sql$) 
      While NextDatabaseRow(DBID)  
        Cnt.c =  GetDatabaseLong(DBID, 0)  
        If Cnt > 0  
          PassFail= #False  
          ErrMsg= "Fighter Size in use in Carrier: "+GetDatabaseString(DBID, DatabaseColumnIndex(DBID,"Name")) 
        EndIf  
      Wend  
    EndIf
    DB::Close(DBID) 

    If PassFail= #False
      THEMEDMESSAGE::MessageBox("Error", ErrMsg) 
    EndIf

    ProcedureReturn PassFail 

  EndProcedure

EndModule



Comments

Popular posts from this blog

How to build this without writing Code

Connecting the Forms to the Data-Layer (part 9)

Connecting the Forms to the Data-Layer (part 8)