Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как избежать дублирования данных при считывании их из внешнего источника
 
 автор: Glebozzz   (04.05.2007 в 17:07)   личное сообщение
 
 

При считывании данных из блокнота и записи их в таблицы Access, необходимо подстраховать себя от повторной записи тех же самых данных. В Блокноте данные постоянно дополняются извне. Я так понимаю, что надо при очередном открытии запомнить номер последней строки исходника и при следующем открытии пролистать предыдущие строки до него и начинать запись уже с него (последнего номера). Дело в том, что я не знаю, как добраться до счетчика строк в блокноте. Пробовал дописать счетчик строк сам, но что-то недомудрил - не работает. Может все это мудрствование - напрасный труд и есть какое-то более простое, проверенное готовое решение проблемы?
С уважением ко всем, кто откликнется ...
Glebozzz

  Ответить  
 
 автор: час   (04.05.2007 в 17:39)   личное сообщение
 
 

можно в таблице задать свойство поля - дааные не повторяются(совпадения не допускаются)т.е. одного из полей которое известно что не должно быть повторений.
или тако не возможно.?
А кусочек текста из блокнота не кините сюда?

  Ответить  
 
 автор: rasiell   (28.06.2008 в 17:00)   личное сообщение
 
 

Всем здрасте!
У меня программа налету создает некоторые таблицы, вот таким образом

Dim oTable As New ADOX.Table
oTable.Name = tablName
Set oTable.ParentCatalog = oCat
oCat.Tables.Append oTable
oTable.Columns.Append colName

Подскажите пожалуйста как можно программно назначить "(совпадения не допускаются)"?
Или как в моем случае не допустить дублированных записей при построчном считывании из текстового файла?

О да, забыл спросить, возможно ли такое назначение сразу всей базе?

  Ответить  
 
 автор: rasiell   (28.06.2008 в 17:11)   личное сообщение
 
 

насколько я накопал для этого надо индексы присвоить, нашел вот такой кусок кода

Public Sub newIndex(dbTable As ADOX.Table)
' dbTable is table where we add new index
Dim dbIndex As ADOX.Index
On Error GoTo errCatch

Set dbIndex = New ADOX.Index
dbIndex.name = "tblPrimaryIndex"
dbIndex.Clustered = True
dbIndex.IndexNulls = adIndexNullsDisallow
dbIndex.PrimaryKey = True
dbIndex.Unique = True

dbIndex.Columns.Append "id_Column"
' id_Column is a name of column

dbTable.Keys.Append dbIndex

dbTable.Indexes.Append "column2Index", "newColumn2"
' newColumn2 is name of column in our table
Exit Sub

errCatch:
MsgBox Err.Description & Err.Number
End Sub

но он сволочь не хочет работать

  Ответить  
 
 автор: osmor   (04.05.2007 в 18:02)   личное сообщение
 
 

При считывании данных из блокнота -
вы считываете данные из текстового файла ил все же из приложения "Блокнот"?
если из файла, то встает вопрос как он формируется, если есть возможность то стоит туда добавить метку времени для каждой записи. при закачке брать только записи со временем больше времени последней закачки.
если есть возможность лучше использовать ADO для доступа к текстовому файлу, т.к. в этом случаем можно будет зопросом отобрать нужные записи..
Ну и конечно совет ув. Час'a по созданию ключа лишним не будет.
А вот если Вы берете данные из приложения "Блокнот", то если можно дайте код посмотреть.

  Ответить  
 
 автор: Explorer   (04.05.2007 в 19:04)   личное сообщение
 
 

КУ: вы считываете данные из текстового файла ил все же из приложения "Блокнот"?


ИМХО люди, который пишут прилады для считывания данных "из Блокнота" (я к их числу не отношусь) таких вопросов задавать не будут :)))

речь, вероятно идет о считывании данных из *.txt файла, тем более, что автор топика пишет, что "В Блокноте данные постоянно дополняются извне" - вероятно работает внешняя программа, которая оставляет лог в txt файле.

можно брать Line или парсить текст по Enter'у

Line к которой нужно обратиться можно хранить/брать из Properties DB... Но

в такой парадигме, что декларирует автор, получается, что данные в TXT только ДОПОЛНЯЮТСЯ - т.е. в каждый момент времени их можно просто перезаписывать поверх предыдущих - старые перезапишутся а новые добавятся...

самое простое что приходит в голову - просто прилинковать txt файл к базе данных

  Ответить  
 
 автор: Glebozzz   (05.05.2007 в 08:44)   личное сообщение
 
 

Ну, если кто-то считает, что у блокнота расширение - не *.txt - то я вообще не в тот форум прописался.
Насчет блокнота - да, точно. Работает внешнее приложение, которое пишет протокол в файл *.txt . Дело в том, что в этом файле счетчика строк вообще нет (или все-таки я его не разглядел?). Надо написать его (счетчик) самостоятельно. Не хочется <<цитата Explorer: "... в каждый момент времени их можно просто перезаписывать поверх предыдущих -старые перезапишутся а новые добавятся...">>
Если данных (строчек в исходнике) 1000-2000 это еще понятно. А если их по 5000 каждый день добавляется - что я через полгода запою? Не надо мне полностью файл исходника каждый раз "лопатить" полностью. Я хочу, чтоб у меня свежие данные как-то вычленялись. И именно их и надо выцарапывать и писать.
Я пробовал написать счетчик строк сам., но у меня почему-то после "пролистывания" данных предыдущих (старых) начинает, гад читать опять с самого начала и по-новой все строчки выдирает. И старые и новые. Вот я и подумал, что может быть у кого-то есть другое решение данной проблемы - готовое. И "велосипед изобретать" не надо. Наверняка все уже изобретено до нас. Matrix?...
Как, кстати у вас на форуме цитировать предыдущего выступающего? Я что-то попробовал - не получилось. На других - проще все.
С уважением ко всем, кто откликнулся...
Glebozzz

  Ответить  
 
 автор: Explorer   (05.05.2007 в 13:01)   личное сообщение
 
 

>Ну, если кто-то считает, что у блокнота расширение - не *.txt - то я вообще не в тот форум прописался.


у блокнота, вообще-то, расширение *.exe - это исполняемый файл (notepad.exe) .
в блокноте, вообще-то, можно открыть файл с любым расширением, хоть *.mdb.

еще раз

просто прилинкуйте txt файл лога к БД - потом работайте с данными запросами

  Ответить  
 
 автор: osmor   (05.05.2007 в 17:25)   личное сообщение
 
 

С цитированием пока проблемы, подучусь немного - приделаю.
Не стоит так заводиться. Вопрос был сформилирован не однозначно именно по этому я и уточнял.
Все же есть очень большая разница между чтением данных из файла и чтением данных из приложения "Блокнот".
Ну, если кто-то считает, что у блокнота расширение - не *.txt - то я вообще не в тот форум прописался.
Вообще расширений файла созданного "блокнотом" может быть любым.
И текстовый файл может иметь любое расширение, от этого он не перестанет быть текстом.

Теперь по сути... я же посоветовал добавлять время создания строки, в этом случае можно легко вычленять новые записи используя adodb.recordset с условием. Ничего лопатить не придется.
Если файл имеет табличную структуру это делается примерно так


Dim conTxt As ADODB.Connection
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field

Dim rstTarget As New ADODB.Recordset
Set conTxt = New ADODB.Connection
conTxt.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\_proj\_mts\;Extended Properties='text;HDR=No;FMT=Delimited'"
Set rst = New ADODB.Recordset
rst.Open "select * from Bill.log where F9 >=dtLastUpdate", conTxt


где F9 - порядковый номер столбца где записано время для данной записи (если в первом столбце то F1)
dtLastUpdate - время последней закачки данных в БД

Вы получите рекордсет содержащий записи из тектового файла у которых время записи больше времени последней закачки

  Ответить  
 
 автор: Glebozzz   (07.05.2007 в 08:31)   личное сообщение
 
 

osmor, файл- исходник имеет структуру вовсе не табличную. К табличной структуре его в таком раскладе еще надо привести. А за идею - спасибо. Может вполне быть реализовано. Пойду мудрить. Как "вымудрю" куда-нибудь - напишу.

С уважением...
Glebozzz

  Ответить  
 
 автор: час   (07.05.2007 в 08:23)   личное сообщение
 
 

Как, кстати у вас на форуме цитировать предыдущего выступающего? Я что-то попробовал - не получилось. На других - проще все

А когда отвечаешь есть правее и выше ссылочка Цитировать,ткнул и всё...

  Ответить  
 
 автор: FORMAT   (28.06.2008 в 17:14)   личное сообщение
 
 

после создание таблицы делайте AlterTable и назначайте полю праймери кей.

  Ответить  
 
 автор: rasiell   (28.06.2008 в 17:20)   личное сообщение
 
 

не могли бы по подробнее, а то у меня перерыв с программингом был 4 года, пока туговато еще...

  Ответить  
 
 автор: FORMAT   (28.06.2008 в 17:24)   личное сообщение
 
 

CurrentDb.Execute ("ALTER TABLE made_orders ADD CONSTRAINT PNUMB PRIMARY KEY ([PNUMB]);")
кусок кода из примера - создает уникальный ключ PNUMB в таблице made_orders

  Ответить  
 
 автор: rasiell   (28.06.2008 в 17:54)   личное сообщение
 
 

не, это выше моего понимания, но всеравно большое спасибо

  Ответить  
 
 автор: rasiell   (28.06.2008 в 22:02)   личное сообщение
 
 

в общем нашел как сделать

Set idx = New ADOX.Index
With idx
.Name = "Index1"
.Columns.Append имя колонки
.Unique = True
End With
oCat.Tables(имя таблицы).Indexes.Append idx

код добавляет индексы к таблице и контент не дублируется

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList