Замена табличных значений текстовым файлом VFP

я пытаюсь заменить таблицу phc информацией из txtfile, но я не получаю информацию на экране.

re — это таблица, которую я хочу заменить значениями. txtcabecalho — это импортированный файл, который люди должны выбрать. sre — экран таблицы re.

    Local txtcabecalho
Use re
Delete all
txtcabecalho=getfile("txt")

Create cursor reciboc(rno n(10), rdata d(10), moeda c(3), no n(10), nome c(2), ccusto c(20), intid c(10), clbanco c(20), total float(19), totalmoeda float(19), ndoc n(3))


append from (txtcabecalho) delimited with tab
select reciboc
goto top
scan for !empty(reciboc.rno)

select re
append blank
replace re.rno with reciboc.rno 
replace re.rdata with reciboc.rdata
replace re.moeda with reciboc.moeda
replace re.no with reciboc.no
replace re.nome with reciboc.nome
replace re.ccusto with reciboc.ccusto
replace re.intid with reciboc.intid
replace re.clbanco with reciboc.clbanco
replace re.total with reciboc.total 
replace re.totalmoeda with reciboc.totalmoeda 
replace re.ndoc with reciboc.ndoc
select re
endscan

sre.refresh()

Спасибо!

Обновлено

Так что это действительно работает, если я создаю собственный файл с разделителем, который я выбираю, например, с вкладками. Дело в том, что файлы, которые мне нужно импортировать, похожи на использование пробелов в качестве пробелов и не имеют разграничения друг от друга. Позвольте мне объяснить лучше. например первые 3 поля rno и rdata и moeda.

Текстовые файлы имеют вид 22014-12-23EUR

Где 2 — это rno, но позади него 9 пробелов, которые работают как заполнители для больших чисел, образуя rno(10). Далее следует 2014-12-23, который находится рядом с rno без разграничения, что делает rdata(10) Далее идет моэда, которая равна EUR, опять же без разграничения, это моэда(3)

Многие поля будут пустыми, а те файлы txt содержат пробелы, занимающие всю длину полей. В основном длина поля используется в качестве разграничения, а когда оно пусто, оно заполняется пробелами.

Вы правильно поняли? извините, я не носитель английского языка.

Обновить

вот часть текстового файла 22014-11-27EUR 208 799,00 799,00 00

просто имейте в виду, что перед первым номером 2 есть 9 пробелов. Спасибо!

поле rdata, которое будет заполнено 2014-11-27, это rdata d(10)

отредактировано

в настоящее время код:

Local txtcabecalho, fileconvert
Use re
zap
txtcabecalho=getfile("txt")
Create cursor reciboc(rno n(10), rdata d(10), moeda c(3), no n(10), nome c(2), ccusto c(20), intid c(10), gg c(20), chq c(20), clbanco c(20), total float(19), totalmoeda float(19), ndoc n(3))

fileconvert = filetostr(txtcabecalho)
chrtran(fileconvert,'-','')
strtofile(fileconvert, txtcabecalho)

append from (txtcabecalho) type sdf
scan 
select re
append blank
replace rno with reciboc.rno 
replace rdata with reciboc.rdata
replace moeda with reciboc.moeda
replace no with reciboc.no
replace nome with reciboc.nome
replace ccusto with reciboc.ccusto
replace intid with reciboc.intid
replace clbanco with reciboc.clbanco
replace total with reciboc.total 
replace totalmoeda with reciboc.totalmoeda 
replace ndoc with reciboc.ndoc
select re

endscan
select reciboc
browse title "resultado"

reindex
sre.refresh()

я получаю это то, что я получаю

все еще пытаюсь понять, я действительно не знаю, афф

например: первая строка должна быть:

РНО 2 РДАТА 27.11.2014 № 208

ОТРЕДАКТИРОВАНО

на самом деле это сделало это ахах

fileconvert = filetostr(txtcabecalho)
fileconvert2 = strtran(fileconvert,'-','')
strtofile(fileconvert2, txtcabecalho)

если мне нужна дополнительная помощь, я обновлю свой вопрос! Большое спасибо, ребята!

ОТРЕДАКТИРОВАНО

Ребята, знаете ли вы, есть ли какие-либо проблемы с преобразованием чисел с плавающей запятой в txt-файле в курсоры?

Я получил, например, 799,20, но я просто отображаюсь как 799. Тип данных установлен на totalmoeda f(19) . Это должно быть довольно просто, но я не могу его найти!


person Joh    schedule 23.05.2016    source источник
comment
Как примечание, когда вам нужно выполнить несколько команд замены, не запускайте отдельные команды замены, а одну. Вы можете сделать много замен с помощью одного, например: заменить f1 на «f1content», f2 на «f2Content» ... Это делает замену за один проход. Вы делаете замену прохода за замену. Здесь это не важно, но имейте в виду, что это сильно влияет на производительность (а разработчики VFP помешаны на производительности).   -  person Cetin Basoz    schedule 24.05.2016
comment
Тип float аналогичен типу numeric. Если вам нужны десятичные дроби, вы должны включить их в определение столбца. F(19) является целым числом, несмотря на тип данных.   -  person Tamar E. Granor    schedule 27.05.2016
comment
Я пытался понять, как это сделать, но я не могу понять, как я должен это сделать.   -  person Joh    schedule 30.05.2016


Ответы (4)


Вы выполняете цикл SCAN, который подразумевает множество строк из таблицы reciboc. Однако в вашей таблице «re» вы просто продолжаете перезаписывать одну и ту же строку одними и теми же значениями, и если в файле нет записи, у вас все равно ничего не будет. Если вы хотите добавить их, вам нужно добавить их в таблицу «RE».

Теперь еще одно соображение касается столбца «rno». Предполагается ли, что это столбец «ID», например, ваш внешний текстовый файл может иметь обновленные значения для каждого заданного «RNO», и вы хотите обновить, если он еще не существует, или добавить, если он НЕ существует в «re» стол?

ОБНОВЛЕНИЕ для вашего вопроса с тегами и дополнительными уточненными элементами...

Если у вас есть индекс в таблице «RE» в столбце «RNO», отлично. Если нет, и это ключевой столбец, на основе которого вы хотите обновить, я предлагаю создать для него индекс...

В командном окне VFP создайте индекс, чтобы он всегда был доступен.

use RE exclusive
index on RNO tag RNO
use

Теперь, в вашем коде, ПОСЛЕ вашего добавления из разделителя, и ваш курсор подготовлен... Я бы установил связь между живой таблицей и вашим временным курсором и выполнил обновление, например...

выберите индекс reciboc на теге RNO RNO &&, чтобы у курсора тоже был индекс.

выберите RE установить отношение к RNO в RECIBOC

Теперь две таблицы указывают друг на друга для любых записей, совпадающих в каждой таблице. Теперь замените FOR [область]. Из-за связи, поскольку записи циклически повторяются в таблице «RE», они будут указывать на одну и ту же запись RNO в таблице «RECIBOC», если она существует. Таким образом, условие FOR проверяет НЕ EOF() (конец файла = совпадение не найдено в RECIBOC. Таким образом, НЕ EOF() означает, что запись ЕСТЬ.

replace rdata with reciboc.rdata,;
        moeda with reciboc.moeda,;
        no with reciboc.no,;
        nome with reciboc.nome,;
        ccusto with reciboc.ccusto,;
        intid with reciboc.intid,;
        clbanco with reciboc.clbanco,;
        total with reciboc.total,;
        totalmoeda with reciboc.totalmoeda,;
        ndoc with reciboc.ndoc ;
   FOR NOT EOF( "RECIBOC" )

наконец, добавьте любые НОВЫЕ записи "RNO" в таблицу "RE". Получите все записи НЕ в вашей существующей таблице RE на основе сопоставления столбца «RNO».

select * ;
   from RECIBOC ;
   WHERE RNO NOT IN ( select RNO from RE );
   into cursor NewRecordsToAdd readwrite

Теперь добавьте их в таблицу «RE». Поскольку столбцы имеют одно и то же имя, они будут переходить напрямую без явного имени столбца из/в ссылку.

select RE
append from dbf( "NewRecordsToAd" )
use in select( "NewRecordsToAdd" )   
person DRapp    schedule 23.05.2016
comment
@joh, только что исправил ответ. Кроме того, в будущем вы можете отредактировать исходный вопрос вместо публикации ответа на него. Вы можете добавлять комментарии к сообщению человека, чтобы он увидел, что вы ответили. Также загляните в верхнее меню Help -> Tour, чтобы узнать об этикете сайта. - person DRapp; 23.05.2016
comment
спасибо за всю вашу помощь, но я очень простой программист vfp, и я не получил половину информации, которую вы там получили. я использую как смесь VFP, xBase и Clipper, я думаю, я использую его для настройки некоторых действий PHC, PHC - это ERP. Думаю, я не мог убедить вас в том, что я пытался сделать. В основном я хочу просмотреть текстовый файл и заменить поля на экране информацией, содержащейся в текстовом файле. синтаксис не совсем такой, как у необработанного VFP, но я могу понять идею. моя основная проблема заключается в том, чтобы поместить ДАННЫЕ ФАЙЛА TXT СООТВЕТСТВЕННО в поля CURSOR. Спасибо - person Joh; 23.05.2016

Create Cursor reciboc(rno N(10), rdata d(10), moeda c(3), no N(10), ;
    Nome c(2), ccusto c(20), intid c(10), clbanco c(20), ;
    Total Float(19), totalmoeda Float(19), ndoc N(3))

Append From (m.txtcabecalho) Type Delimited With Blank

Select re
Append from (Dbf('reciboc'))

Выше приведена более короткая версия того, что вы пытаетесь сделать.

person Cetin Basoz    schedule 23.05.2016

В вашем обновлении вы описываете формат данных с фиксированной шириной или то, что известно как формат системных данных (SDF). Тогда не используйте разделители, а SDF в качестве типа:

Create Cursor reciboc(rno C(10), rdata C(10), moeda c(3), no C(10), ;
    Nome c(2), ccusto c(20), intid c(10), clbanco c(20), ;
    Total C(19), totalmoeda C(19), ndoc C(3))

Append From (m.txtcabecalho) Type SDF

alter table reciboc alter column rdata d && convert rdata column to date
* do other needed column type conversions

Select re
Append from (Dbf('reciboc'))

Размеры, которые вы используете при создании курсора, должны соответствовать размерам столбцов данных в текстовом файле. После получения всех данных в виде текста измените столбцы, чтобы они соответствовали типам данных (я предположил, что ваши размеры были правильными) - d (10) не имело смысла, а float никогда не предлагался. тип.

PS: Если вы можете найти FoxyClasses, то в нем есть класс импортера, который выполняет большую часть работы за вас (к сожалению, я потерял сервер, на котором обслуживал загрузку). Вы можете прочитать подробности в его файле chm, если сможете найти.

person Cetin Basoz    schedule 24.05.2016
comment
Чувак, спасибо тебе ОГРОМНОЕ, как я уже сказал, я уже два дня изучаю эти языки, и мне еще многое предстоит выучить. одна вещь. Формат, для которого отформатирована таблица re, — dd-mm-yyyy, но файл поставляется в формате yyyy-mm-dd , ребята, вы знаете, как противостоять этому? Если я не изменю это, все пойдет вразнос, ахах. это поле rdata из обоих - person Joh; 24.05.2016
comment
Каким бы ни был формат в текстовом файле, установите соответствующий формат даты. то есть: если в текстовом файле это гггг-мм-дд, то: установите дату ГМД, если это дд-мм-гггг, затем установите дату ДМГ. Выполните эту команду в любом месте, прежде чем выполнять действия по изменению таблицы. А также, скажем, если бы формат даты был чем-то нестандартным, вы могли бы также манипулировать данными с помощью функции (но теперь это продвинуто для вас). - person Cetin Basoz; 24.05.2016
comment
Я думаю, что есть некоторый конфликт с - - - у меня такая же проблема. Следуя примерам, которые я привел, вместо того, чтобы показывать EUR, отображается 28E, где 28 является частью даты, а на дате ничего не отображается. поэтому я чувствую, что есть проблема с 3 символами, вероятно, - - -. Я буду продолжать работать над этим, чтобы увидеть, смогу ли я найти решение. Спасибо ! - person Joh; 24.05.2016
comment
Почему бы вам не дать нам несколько строк из вашего текстового файла? (было бы неплохо, если бы вы могли отредактировать свой вопрос и добавить строки, как есть). - person Cetin Basoz; 24.05.2016
comment
я не думаю, что stackoverflow обнаруживает пробелы. но вот: 22014-11-27EUR 208 799,00 799,00 00 дата противоречива, потому что там, где должен был показывать EUR, показывает 27E. - person Joh; 24.05.2016
comment
Здесь, в комментариях, вы правы, я бы не смог получить это как есть. Однако вы можете отредактировать исходный вопрос и добавить его в качестве кода. - person Cetin Basoz; 24.05.2016

У меня работает ровно 9 пробелов до 2:

Create Cursor reciboc(rno C(10), rdata C(10), moeda c(3), no C(10), ;
    Nome c(2), ccusto c(20), intid c(10), clbanco c(20), ;
    Total C(19), totalmoeda C(19), ndoc C(3))

Append From (m.txtcabecalho) Type SDF
browse title "Before data type change"

Set Date YMD
Set Century ON

alter table reciboc alter column rdata d && convert rdata column to date
browse title "After date type change"

В случае SDF имейте в виду, что позиции в текстовом файле определяют ширину полей.

person Cetin Basoz    schedule 24.05.2016
comment
у меня все еще такая же проблема, и я не могу понять это. Поле rdata в моем курсоре имеет ширину 10. НО, если я уберу -- из текстового файла, все будет работать нормально, даже если после этого он останется с шириной 8. изменение таблицы или текстовых файлов не вариант. Я предполагаю, что уже есть два - в поле rdata в таблице re, которые заполняют 2 пробела, оставляя только 8, поэтому он подходит правильно. Как вы думаете? Я не знаю, как мне поместить данные в rdata, чтобы он игнорировал - из txt файла. Спасибо за помощь ребята - person Joh; 27.05.2016
comment
Есть функции chrtran() и strtran(), но я не понимаю, что вы имеете в виду. Попробуйте заменить rdata на chrtran(rdata,'-','') all - на reciboc перед командой alter table. Это просто работает с - для меня. - person Cetin Basoz; 27.05.2016
comment
Проверьте уставку. Или, в качестве альтернативы, вы можете заменить запятую соответствующей точкой десятичного разделителя. - person Cetin Basoz; 28.05.2016