Рекомендации к составлению программ на QPILE

  1. Функции для работы со структурными переменными, такие как «SET_VALUE», «INSERT_COLLECTION_ITEM», «REMOVE_COLLECTION_ITEM» возвращают измененное значение коллекции или массива. Поскольку все параметры передаются в функцию по значению, то использование данных функций в качестве процедур приводит к потере сделанных в них изменений.

    Например:

    clientscol=INSERT_COLLECTION_ITEM(clientscol,0,initmap) 
    
    ‘правильно
    INSERT_COLLECTION_ITEM(clientscol,0,initmap)
    ‘неправильно, в этом случае после вызова функции clientscol будет содержать то же значение, что и до ее вызова
  2. Возвращаемые функциями значения могут оказаться строковыми, хотя и представлять вещественное число. В этих случаях нужно использовать сложение с «0» для преобразования результата к численному значению. Например, для корректной инициализации переменной в операторе присваивания вида «v=GET_VALUE()» стоит написать «v=0+GET_VALUE()». В последнем случае гарантированно достигается вещественное значение переменной.

    Аналогичным образом, для приведения вещественного значения к строковому может использоваться операция склейки с пустой строкой «v=""&GET_VALUE()».

  3. Произвольные пользовательские типы могут быть сформированы путем комбинации коллекций и ассоциативных массивов.  Например, если нужен список структур типа:
    c=strruct{
    openbal:double
    closebal:double
    clientcode:string}
    то его можно представить как коллекцию ассоциативных массивов в каждом из которых будет три ключа – «OPENBAL», «CLOSEBAL», «CLIENTCODE».  Код для инициализации такой структуры:
    initmap=CREATE_MAP()
    initmap=SET_VALUE(initmap,"OPENBAL",0)
    initmap=SET_VALUE(initmap,"CLOSEBAL",0)
    initmap=SET_VALUE(initmap,"CLIENTCODE","")
    clientscol=CREATE_COLLECTION()
    FOR i FROM 0 TO 10
      clientscol=INSERT_COLLECTION_ITEM(clientscol,0,initmap)
    END FOR
    После чего, для доступа к полю «OPENBAL» 5-го клиента надо написать:
    openbal = GET_VALUE(GET_COLLECTION_ITEM(clientscol,5),"OPENBAL")

    Если вместо коллекции таких записей использовать массив с ключом представляющим из себя код клиента, то можно будет обращаться к значениям структуры клиента без указания его индекса в массиве, а зная только клиентский код:

    clientsmap=CREATE_MAP()
    FOR i FROM 0 TO 10
      clientsmap=SET_VALUE(clientsmap,"Q" & i, initmap)
    END FOR

    и последующее обращение к значению поля «OPENBAL» для клиента с кодом «Q5»:

    openbal = GET_VALUE(GET_VALUE(clientsmap,"Q5"),"OPENBAL")
  4. «MODIFY_ITEM» не выполняет действий, если указанной строки в таблице «OWN» еще нет.  Поэтому надо предварительно проверять ее наличие.

    При построении пользовательской таблицы на каждой итерации изменяющей в себе строку полезным будет код:

    new_global("first_time_flag",0) 
      
    if first_time_flag==0
      add_item(1,SAMPLE)
      first_time_flag=1
    else
      modify_item(1, SAMPLE)
    end if

    При первом запуске создается строка номер 1 со значениями полей из переменной «SAMPLE» насчитанной ранее, а на последующих итерациях строка номер 1 модифицируется.