Страница 1 из 1

Чтение последней строки в таблице

Добавлено: 26 Июль 2010, 23:59
Evgeny2006
Версия С_6.3_9058 (Обновленная с версии 6.0.0)
Никто не сталкивался с такой проблемой, как чтение последней записи таблицы?

Кстати вопрос для всех! Разве Routine нарушает диапазон видимости?
Я взял и перенес кусок кода из вызывающей программы в Routine. Правда в вызывающей программе использовались неявные переменные. Так этот кусок работать отказался. Хотя первое неявное объявление сделано в вызывающей программе.

Вот отрывок текста программы, обложенный выводом на экран. То, что сдвигается, я не виноват. (Заодно может кто-нибудь подскажет, как вставлять отформатированный текст).

Код: Выделить всё

    do OpenTLV     ! Открытие файла типа Create
    do OpenTLI


    recNo#=0
    n_35#=0
    n_110#=0
    n_220#=0
    n_330#=0
    n_500#=0

    set(TLV:TLVRegkey)
    next(TLView)
    curReg"=TLV:region                    ! Текущий район

    LOOP UNTIL EOF(TLView)                !Loop through TLView
       MESSAGE('Номер коридора = ' & TLV:numcor)
       MESSAGE('Номер ВЛ = ' & TLV:numTL)
       MESSAGE('Район = ' & TLV:region)
       MESSAGE('Напряжение = ' & TLV:napr)
       MESSAGE('Длина ВЛ = ' & TLV:lenCor)
       IF TLV:region <> curReg" THEN
          recNo#=recNo#+1
          TLI:recno=recNo#
          TLI:region=curReg"
          TLI:n_35=n_35#
          TLI:n_110=n_110#
          TLI:n_220=n_220#
          TLI:n_330=n_330#
          TLI:n_500=n_500#
          ADD(TLItog1)
          curReg"=TLV:region
           n_35#=0
           n_110#=0
           n_220#=0
           n_330#=0
           n_500#=0
           CYCLE
       END

      CASE TLV:napr
      OF 35
         n_35#=n_35#+TLV:lenCor
      OF 110
         n_110#=n_110#+TLV:lenCor
      OF 220
         MESSAGE('Длина ВЛ = ' & TLV:lenCor)
         n_220#=n_220#+TLV:lenCor
         MESSAGE('Суммарная длина ВЛ = ' & n_220#)
      OF 330
         n_330#=n_330#+TLV:lenCor
      OF 500
         n_500#=n_500#+TLV:lenCor
      END

    next(TLView)
  END
! Дозапись последней записи
    recNo#=recNo#+1
    TLI:recno=recNo#
    TLI:region=curReg"
    TLI:n_35=n_35#
    TLI:n_110=n_110#
    TLI:n_220=n_220#
    TLI:n_330=n_330#
    TLI:n_500=n_500#
    ADD(TLItog1)

! Закрытие файлов
   CLOSE(TLView)
   Close(TLItog1)

Re: Чтение последней строки в таблице

Добавлено: 27 Июль 2010, 1:32
Vitaly_Ox
Не ясно зачем Вам второй файл? Ошибка не столько в технике сколько в неправильном мышлении
Итоги лучше получать динамически отфильтровывая ненужные записи.
A создать запись лучше так
Присвоить значения полям (ключевым)
Get(TLView,TLV:TLVRegkey)
If Error()
Clear(TLV:record)
Присвоение значений полям
ADD(TLView) !Новая запись
else
!Такая запись существует
PUT(TLView)
end

_________________________________________
А итоги построить так к примеру
Создать файл с перечнем регионов как ПЕРВИЧНЫЙ, а к нему вытаскивать требуемую сумму динамически
Читая первичный файл в таблице по ключу (REG:REGION_key)
TLV:Region=Reg:Region
Set(TLV:TLVRegkey,TLV:TLVRegkey)
Loop
next(TLView)
If ~Error()
SCR:Sum1+=TLI:n_35 !Экранные переменные объявить и показать в Browse
SCR:Sum2+=TLI:n_110
Else
Break
End
END

Тогда Вы можете все время добавлять записи в TLView и иметь всегда актуальные итоги

Re: Чтение последней строки в таблице

Добавлено: 27 Июль 2010, 10:36
Admin
Друзья... учитесь пользоваться командой вставки исходников... у вас же сверху есть теги Code
А то ваши неформатированные перлы читать не совсем удобно. :!:

Re: Чтение последней строки в таблице

Добавлено: 27 Июль 2010, 11:50
Evgeny2006
Admin прав, что читать такой текст неудобно, да и сразу проверить не удастся. Потребуется его переформатирование!!!
Я вижу в заголовке "Ответить" различные свойства, но пользоваться не пробовал. Простите, я новичок на форуме, да и честно, как то работал по принципу: скопировал и вставил.

Относительно, обработки записей. Я знаю о возможности использования заранее составленной таблицы районов. Она даже у меня есть. Но по внутренним причинам я отказался от нее. И более того вообще удалил из приложения, заменив ее на Combo-box.
Здесь ведь вопрос не в том, правильно ли я делаю, а в том, в чем ошибка? И в программе ли она?
Логически я не вижу ошибки в программе, а тем не менее последняя запись пропадает. Дело принципа - найти ошибку. А решений по формированию итогового файла несколько.

В любом случае - всем огромное СПАСИБО за советы и рекомендации.

Re: Чтение последней строки в таблице

Добавлено: 28 Июль 2010, 0:57
WadimZapara
ТВОЯ ОШИБКА В ИСПОЛЬЗОВАНИИ СЛЕДУЮЩЕЙ КОНСТРУКЦИИ

Код: Выделить всё

  NEXT(TLView)
  curReg" = TLV:Rregion        ! СОХРАНИТЬ ОБРАЗЕЦ
  LOOP UNTIL EOF(TLView)
...
     IF curReg" <> TLV:region  ! ДЛЯ ПЕРВОЙ ЗАПИСИ - СРАВНЕНИЕ ОБРАЗЦА С САМИМ СОБОЙ
...
        curReg" = TLV:region   ! СОХРАНИТЬ НОВЫЙ ОБРАЗЕЦ
        CYCLE
     END
...
    NEXT(TLView)
  END
! СЮДА ПРИХОДИМ, КОГДА EOF() ВЫДАЛА ИСТИНУ, ТО ЕСТЬ СТОИМ ЗА КОНЦОМ ФАЙЛА И ПОЛЯ В ЗАПИСИ ИМЕЮТ ЗНАЧЕНИЕ ПОЛЕЙ ПОСЛЕДНЕЙ УДАЧНО СЧИТАННОЙ ЗАПИСИ
Итак, 1-ая запись не обработана вовсе, а последняя - возможно, обработана дважды(если последнее сравнение на <> было верным)

Re: Чтение последней строки в таблице

Добавлено: 28 Июль 2010, 1:07
WadimZapara
Надо бы так:

Код: Выделить всё

  Set(...)
  образец = ''
  Loop
     Next(TLView)
     If ErrorCode() Then Break.
     If значение_файла <> образец Then
        DO очистка_обновляемых_значений
        образец = значение_файла
     End !If
     DO добавление_обновляемых_значений    
  End !Loop

Re: Чтение последней строки в таблице

Добавлено: 28 Июль 2010, 10:41
Evgeny2006
Новое сообщение WadimZapara » 28 Июль 2010, 1:07
Надо бы так:
Спасибо большое. Я вообщем в конце-концов так и сделал.

Re: Чтение последней строки в таблице

Добавлено: 28 Июль 2010, 10:55
Evgeny2006
Сообщение WadimZapara » 28 Июль 2010, 0:57
ТВОЯ ОШИБКА В ИСПОЛЬЗОВАНИИ СЛЕДУЮЩЕЙ КОНСТРУКЦИИ
Да. Плохо когда глаза замыливаются.
Все правильно Вы подсказываете. Дело в том, что я никак не мог выйти на чтение первой записи. Я использовал разные SET и в конце тот, который в ошибочном куске, стал правильно давать первую запись. Но к этому моменту, я уже об этом забыл и стал ловить последнюю запись, забыв, что необходимо смотреть в целом.

Спасибо.