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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Evgeny2006
Бывалый
Сообщения: 61
Зарегистрирован: 23 Июль 2010, 13:44
Откуда: С-Петербург

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

Сообщение 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)
Последний раз редактировалось Evgeny2006 27 Июль 2010, 13:01, всего редактировалось 1 раз.
Evgeny2006
Vitaly_Ox
Прохожий
Сообщения: 1
Зарегистрирован: 06 Июль 2010, 10:22

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

Сообщение 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 и иметь всегда актуальные итоги
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение Admin »

Друзья... учитесь пользоваться командой вставки исходников... у вас же сверху есть теги Code
А то ваши неформатированные перлы читать не совсем удобно. :!:
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Evgeny2006
Бывалый
Сообщения: 61
Зарегистрирован: 23 Июль 2010, 13:44
Откуда: С-Петербург

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

Сообщение Evgeny2006 »

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

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

В любом случае - всем огромное СПАСИБО за советы и рекомендации.
Evgeny2006
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

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

Сообщение WadimZapara »

ТВОЯ ОШИБКА В ИСПОЛЬЗОВАНИИ СЛЕДУЮЩЕЙ КОНСТРУКЦИИ

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

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

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

Сообщение WadimZapara »

Надо бы так:

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

  Set(...)
  образец = ''
  Loop
     Next(TLView)
     If ErrorCode() Then Break.
     If значение_файла <> образец Then
        DO очистка_обновляемых_значений
        образец = значение_файла
     End !If
     DO добавление_обновляемых_значений    
  End !Loop
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Evgeny2006
Бывалый
Сообщения: 61
Зарегистрирован: 23 Июль 2010, 13:44
Откуда: С-Петербург

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

Сообщение Evgeny2006 »

Новое сообщение WadimZapara » 28 Июль 2010, 1:07
Надо бы так:
Спасибо большое. Я вообщем в конце-концов так и сделал.
Evgeny2006
Evgeny2006
Бывалый
Сообщения: 61
Зарегистрирован: 23 Июль 2010, 13:44
Откуда: С-Петербург

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

Сообщение Evgeny2006 »

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

Спасибо.
Evgeny2006
Ответить