Пожалуйста, не блокируйте рекламу!

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн FlintFD

  • **
  • 34
  • Репутация: +2/-0
  • Пол: Мужской
Данные во внешнем файле
« : Января 19, 2014, 10:26:25 »

Test

Поиском пробовал решить вопрос но ничего к сожалению не нашёл.
Проблема: Существует объект (даже несколько), одна из основных функций объекта это возможность выбора определённого наименования изделия и подстановка его параметров.
в коде это выглядит так
VALUES "_B" "С2000-АСПТ","С2000-4","Сигнал-20","Сигнал-20М","Сигнал-20П"
и далее 
if  _B =  "Сигнал-20М" then parameters tok_d = 400, tok_p = 600, _D= "Болид",Q=`4,7 кОм`
if  _B = "С2000-АСПТ" then parameters tok_d = 200,tok_p = 200, _D= "Болид", Q=`4,7 кОм`
if  _B = "С2000-4" then parameters tok_d = 180,tok_p = 220, _D= "Болид" , Q=`4,7 кОм`
if  _B =  "Сигнал-20" then parameters tok_d = 350, tok_p = 400, _D= "Болид",Q=`4,7 кОм`
if  _B =  "Сигнал-20П"   then parameters tok_d = 400, tok_p = 450, _D= "Болид",Q=`4,7 кОм`
Всё работает и всё вроде хорошо, но постоянно необходимо добавлять изделия, делать это приходится естественно только открыв объект и отредактировать код.
Есть ли возможность всё это делать во внешнем файле, простом txt? Вроде обратится к внешнему файлу есть возможность, но как это правильно сделать, при этом чтоб переменной присвоились все значения столбца 1 всех строк... чего то не догнал (вообще как правильно обратится к значениям в файле и присвоить чего там есть переменной  не вполне понял, справка мало в этом помогла), OPEN
 и INPUT вроде вертел, никак... А как при выборе значения из первого столбца потом будут присваиваться значения соответствующей переменной из этой строки (аналог ВПР Экселя) не представляю. С массивами не знаком, подозреваю что может через них, но... В общем встало всё. 

*

Оффлайн Kuvbur

  • ^_^
  • ****
  • 370
  • Репутация: +69/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #1 : Января 19, 2014, 11:28:11 »
dim vekt[]
!Открываем файл f_name, подгруженный в библиотеку, и читаем из него список наименований
v1 = ""
szelv = open("text", f_name, "separator='\t', mode=ro, LIBRARY")
!Цикл начинается с 2, т.к. первая строка - имена столбцов
for i = 2 to sor - 1
   mm = input(szelv, i, 2, v1)
   vekt[i-1] = v1
next i
close szelv
!Собственно выбор наименования
values "Profile" vekt
!Определяем номер строки в массиве с этим наименованием
for i = 1 to VARDIM1(vekt)
   if Profile = vekt[i] then
      n_stroki = i + 1
   endif
next i
PARAMETERS n_stroki = n_stroki
szelv=open("text", f_name, "separator='\t', mode=ro, LIBRARY")
   !Считываем параметры
   n=input(szelv, n_stroki, 3, ves_p, ds, ws, wt, ft, rr, tr, as, dbf)
close szelv
parameters ds = ds, ws = ws, wt = wt, ft = ft, rr = rr, tr = tr, dbf = dbf, ves_p = ves_p
А чтобы не добавлять код в каждый объект - создайте тип (шаблон) и применяйте его ко всем нужным объектам. Для этого просто сделайте объект отдельный, с параметрами и скриптами, которые будут общими у всех объектов, и обращайтесь потом к немй с помощью call "ИМЯ" parameters all . У общего объекта (родительского) на вкладке Детали отметить пункт "использовать как подтип", а у дочерних - выбрать этот объект через выбор подтипа
« Последнее редактирование: Января 19, 2014, 11:38:23 от daimoon »

*

Оффлайн FlintFD

  • **
  • 34
  • Репутация: +2/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #2 : Января 19, 2014, 11:42:53 »
Спасибо огромное, сейчас буду пробовать крутить и прикручивать. У меня так и есть, всё что есть общего в объектах сделано в родительском объекте, он и подтип и к нему через  call обращение. (верней их несколько, для расчётов, для пользовательского интерфейса и пр., чтоб не путаться)

Добавлено: Января 19, 2014, 12:23:02
Почему то пример не могу скачать, именно с этого только сайта ничего не докачивается... странно.

Добавлено: Января 19, 2014, 12:40:19
Не, без примера запутался, если есть возможность, через Яндекс диск или подобный сервис киньте.

Добавлено: Января 19, 2014, 14:34:43
Спасибо, В общих чертах разобрался, теперь красота. Но сразу возник вопрос, возможно ли получить количество непустых строк в файле txt, чтоб не прописывать их каждый раз в библиотечный элемент?
« Последнее редактирование: Января 19, 2014, 14:34:43 от FlintFD »

*

Оффлайн Kuvbur

  • ^_^
  • ****
  • 370
  • Репутация: +69/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #3 : Января 19, 2014, 15:12:19 »
Да, конечно. Просто вместо первого цикла с for используйте 
   n = 1 : i = 2 : v1 = ""
   while n = 1 do
      n = input(szelv, i, 2, v1)
      vekt[i-1] = v1
       i = i + 1
   endwhile
   kol_vo_strok = i - 1

*

Оффлайн FlintFD

  • **
  • 34
  • Репутация: +2/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #4 : Января 19, 2014, 16:15:37 »
Может я чего не понимаю, но не всё работает:
dim vekt[]
v1 = ""
ch1 = open("text", "Приборы.txt", "separator=' ', mode=ro, LIBRARY")
n = 1 : i = 2 : v1 = ""
   while n = 1 do
     n = input(ch1, i, 2, v1)
     vekt[i-1] = v1   
     i = i+1
   endwhile
n_stroki = i-1
close ch1

values "_B" vekt, CUSTOM

for i = 1 to VARDIM1(vekt)
   if _B = vekt[i] then
      n_stroki = i + 1
   endif
next i
PARAMETERS n_stroki = n_stroki
ch2=open("text", "Приборы.txt", "separator=' ', mode=ro, LIBRARY")
n=input(ch2, n_stroki, 3, tok_d, tok_p, _D, Q)
close ch2
parameters tok_d = tok_d, tok_p = tok_p, _D = _D, Q = Q
Выводится http://floomby.ru/s1/e4sans , в файле http://floomby.ru/s1/34sakc . Откуда лишний прибор берётся непонятно, при подстановки параметров два нижних прибора (дубляж) не подставляются параметры. Гдето что то лишнее, не пойму где, менял где только можно значения.

Добавлено: Января 19, 2014, 17:08:55
Получилось нечто рабочее, но не вместо а до первого цикла For вставить:
   n = 1 : с = 2
   while n = 1 do
     n = input(ch1, с, 2, v1)
с = с+1
  endwhile
PARAMETERS sor = с-1

for i = 2 to sor - 1 .....
« Последнее редактирование: Января 19, 2014, 17:08:55 от FlintFD »

*

Оффлайн Kuvbur

  • ^_^
  • ****
  • 370
  • Репутация: +69/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #5 : Января 19, 2014, 18:27:11 »
Хм. Нет, должно быть именно вместо. Вы в цикле заполняете временный массив и в нём же подсчитываете строки. Попробуйте  
dim vekt[]
v1 = ""
ch1 = open("text", "Приборы.txt", "separator=' ', mode=ro, LIBRARY")
pos_start = 2
n = 1 : i = pos_start : v1 = ""
   while n = 1 do
     n = input(ch1, i, 2, v1)
     vekt[i-1] = v1  
     i = i+1
   endwhile
!n_stroki = i-1 - это удалить
close ch1

values "_B" vekt, CUSTOM

for i = pos_start to VARDIM1(vekt)
   if _B = vekt[i] then
      n_stroki = i + !1 это прибавку попробовать убрать
   endif
next i
!PARAMETERS n_stroki = n_stroki - нужно только для обмена с дочерними файлами, не обязательно
ch2=open("text", "Приборы.txt", "separator=' ', mode=ro, LIBRARY")
n=input(ch2, n_stroki, 3, tok_d, tok_p, _D, Q)
close ch2
parameters tok_d = tok_d, tok_p = tok_p, _D = _D, Q = Q

*

Оффлайн FlintFD

  • **
  • 34
  • Репутация: +2/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #6 : Января 19, 2014, 19:24:08 »
http://floomby.ru/s1/94sUKp не работает тоже. Отмеченные параметры меняются только два раза, в файле прибор чтопопальный по названию присутствует естественно один.

Добавлено: Января 19, 2014, 19:29:09
http://floomby.ru/s1/T4sUx4 , интересное поведение, если помеченная строка полностью, то параметры прибора 1 и 2 нормальные, если без +1, то 2 и 3 соответственно. В любом случае дубляж последнего прибора идёт, причём если добавить удалить, то всегда последний дублируется.

*

Оффлайн Kuvbur

  • ^_^
  • ****
  • 370
  • Репутация: +69/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #7 : Января 20, 2014, 10:22:44 »
dim vekt[]
v1 = ""
f_name = "test.txt"
ch1 = open("text", f_name, "separator=' ', mode=ro, LIBRARY")
pos_start = 2
n = 1 : i = pos_start : v1 = "" : vekt[1] = "" : tmp = ""
   while n = 1 do
      n = input(ch1, i, 2, v1)
      if v1 <> tmp then
         vekt[i-1] = v1
         tmp = v1
      endif
      if n > 0 then i = i + 1
   endwhile
close ch1
values "_B" vekt
for i = 1 to VARDIM1(vekt)
   if _B = vekt[i] then
     n_stroki = i + 1
   endif
next i
ch2=open("text", f_name, "separator=' ', mode=ro, LIBRARY")
n=input(ch2, n_stroki, 3, tok_d, tok_p, _D, Q)
close ch2
parameters tok_d = tok_d, tok_p = tok_p, _D = _D, Q = Q
На тестовом файле работает.

*

Оффлайн FlintFD

  • **
  • 34
  • Репутация: +2/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #8 : Января 20, 2014, 20:52:32 »
Спасибо огромное, вроде как положено работает. Ещёбы разобраться нормально как это работает, половина не вполне доходит. И как обычно прикреплённый файл не качается, но скопированный код нормально встал.

*

Оффлайн regySER

  • ***
  • 236
  • Репутация: +19/-0
Re: Данные во внешнем файле
« Ответ #9 : Января 22, 2014, 12:39:38 »
Не могли бы поделиться весми работающими файлами в комплексе ("родительский", дочерний объекты, файл .txt ...)

*

Оффлайн FlintFD

  • **
  • 34
  • Репутация: +2/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #10 : Января 25, 2014, 13:13:33 »
Нету пока таких файлов, есть некое начало, где пока на стадии "вроде работает", в первом моём посте часть кода показана, он приличный (приборов много), к тому что есть добавлены данные коды, существующий объект берёт свойства ещё из трёх объектов, в общем всё и затевается чтоб бардака не было, я уже сам запутался какие свойства где берутся... :( , наваял и дополнял в течении нескольких лет, бардак короче, с нуля надо всё переделывать. Но что получилось (много там не работает, почти всё, но обсуждаемая  функция работает)

*

Оффлайн FlintFD

  • **
  • 34
  • Репутация: +2/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #11 : Марта 19, 2014, 05:15:38 »
После долгих ковыряний и настройки, выяснил один неприятный момент, который заставил меня изрядно поматериться. Есть объект и есть внешний текстовый файл данных, объект считывает информацию по элементам, всё вроде хорошо, но если внешний файл содержит скажем столбцов 10, и эти столбцы содержат: 1 текст, 2 текст, 3-5 числа, 6 текст и тд. в любом порядке, соответственно каждому столбцу в объекте соответствует свой параметр, которому присвоено свойство, или текст, или числовой (любой числовой формат) . По первому столбцу формируется список и остальное подтягивается из соответствующей строки нужного столбца (эта тема для этого и создавалась). Так вот, если в любом из столбцов с текстовой информацией отсутствует запись, всё перестаёт работать. По идее пустой ячейке присваивается значение 0 (так в справке написано), этот 0 воспринимается программой корректно только в числовом формате. Пришлось мудрить, ставить в пустые поля дефисы (пробелы и принудительные нули не помогают), перенастраивать базы... Чтож они гады не указали в справке что пустые текстовые блоки не должны присутствовать в файле?  Непорядок.

*

Оффлайн Kuvbur

  • ^_^
  • ****
  • 370
  • Репутация: +69/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #12 : Марта 20, 2014, 13:21:36 »
Для этого есть проверка VARTYPE. Если надо всё в один массив стащить - то через VARTYPE надо проверить - текст ли это. Если не текст, то преобразовать  текст.

*

Оффлайн FlintFD

  • **
  • 34
  • Репутация: +2/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #13 : Марта 20, 2014, 14:37:49 »
Так мне надо чтоб всё и было разное. Берём наименование (текст) по этому наименованию вытаскиваем разные параметры. Эти параметры и текст и цифры. Например есть список: Ложка 1, ложка 2..... Выбрав ложка 2 мы имеем: Вес=100 (число), Материал= сталь (текст), Длина = 10 (число), Разное=Куплена в Москве (текст) (остальные ложки соответственно другие параметры), так если в этом списке я фиг знает где купил эту ложку, то поле соответственно пустое и всё перестаёт работать, можем выбрать только ложку, всё остальное каюк. Если только каждую переменную проверять и преобразовывать, как проверить прочитал, теперь подумаю как преобразовать.

Добавлено: Марта 20, 2014, 14:59:00
IF VARTYPE (URL) = 1 THEN URL = STR(URL,1,1)
Так не работает

Добавлено: Марта 20, 2014, 15:21:17
IF VARTYPE (URL) <>2 THEN URL = ""
А вот так работает :)
« Последнее редактирование: Марта 20, 2014, 15:21:17 от FlintFD »

*

Оффлайн Kuvbur

  • ^_^
  • ****
  • 370
  • Репутация: +69/-0
  • Пол: Мужской
Re: Данные во внешнем файле
« Ответ #14 : Марта 20, 2014, 18:59:08 »
Именно так. Только стоит сделать 
EMPTY = ""
IF VARTYPE (URL) <>2 THEN URL = EMPTY
Так в случае чего проще менять будет. Не тот же дефис, например.

 

Похожие темы

  Тема / Автор