On-line: tnsr2, гостей 1. Всего: 2 [подробнее..]
АвторСообщение
администратор




Пост N: 642
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.07 12:24. Заголовок: [?] Предложите метод


Имеем базу. В ней 2 поля COD (код товара) , NAIM (наименование)
Необходимо выявить "не верные" записи по 2-м условиям.

В идеале должно быть:
Товар с одним и тем же кодом должен иметь одинаковое наименование
Товар с одинаковым наименованием не должен иметь разные коды.

Индексные файлы по этим полям есть.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 10 [только новые]


администратор




Пост N: 643
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.07 12:26. Заголовок: Re:


примерчиг

 цитата:


Код Наименование
12 XXX
12 XXX
12 X1X
12 XXX
12 X2X



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 644
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.07 13:07. Заголовок: Re:


На скорую руку , применительно к примеру.
Собираем инфу о том сколько раз повторяется каждое наименование с кодом 12
Вероятно что то название которое встретилось наибольшее кол-во раз и является наиболее
корректным.

local amas:={{0,""}}
local i:=0
local y:=0
use test new

do while !eof()
i:=ascan(amas,{|x| x[2]==naim })
if i==0
if amas[1][1]==0
amas[1][1]:=1
amas[1][2]:=naim
else
aadd(amas,{1,naim})
endif
else
amas[1]+=1
endif
skip
enddo

aeval(amas,{|x| y:=max(x[1],y)})

// максимальное кол-во наименований с данным кодом
? y // 3
// -//-//-//-//- наименование
? amas[ascan(amas,{|x| x[1]==y})][2] // XXX


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 124
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.03.07 14:03. Заголовок: Re:


для xHarbour

LOCAL hHash := Hash()
LOCAL a1, a2

USE test NEW READONLY
WHILE ! Eof()
IF test->COD == 12
IF HHasKey( hHash, test->NAIM )
hHash[ test->NAIM ] += 1
ELSE
hHash[ test->NAIM ] := 0
ENDIF
ENDIF
SKIP + 1
END WHILE
USE

a1 := HGetKeys(hHash)
a2 := HGetValues(hHash)

ну а дальше с двумя массивами работать

Если надо в начале можно установить
HSetCaseMatch( hHash, .F. )


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 286
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.07 15:45. Заголовок: Re:


Я бы все записал не в массив (массив ограничен 4096 записями), а в текстовый файл. Код написан "на коленках", поэтому не удивляйтесь, если некоторые функции или команды написаны неверно. Нет под рукой шпаргалки.
На мой взгляд с файлом проще, так как с ним можно дальше работать.

#DEFINE CRLF CHR( 13 ) + CHR( 10 )
#DEFINE TAB CHR( 09 )
#DEFINE EOF CHR( 26 )

PROCEDURE MAIN( cFileSpec )
LOCAL nHandle, cFileSpec
LOCAL lNewCode, nIndex

DEFAULT cFileSpec TO "C:\DBFCHECK.TXT"

nHandle := FOPEN( cFileSpec ) // Здесь еще можно добавить флаг режима открытия

IF ( FERROR() != 0 )
ERROROUT( cFileSpec + " open error! )
QUIT( 1 )
ENDIF

USE TEST NEW READONLY

lNewCode = .T.
DO WHILE ( !EOF() )
IF ( lNewCode )
lNewCode := .F.
nIndex = FIELD->COD
// Увы, не помню формат функции FWRITE() !
FWRITE( nHandle, STR( nIndex, 10 ) + CRLF )
ENDIF
IF ( nIndex != FIELD->COD )
lNewCode := .T.
ELSE
FWRITE( nHandle, TAB + NAIM + CRLF )
ENDIF
SKIP
ENDDO

FWRITE( nHandle, EOF )
FCLOSE( nHandle )

CLOSE DATABASE

RETURN




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 287
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.07 15:48. Заголовок: Re:


Извините, пропустил, что поле названия также не должно повторяться.
Поэтому добавляем

LOCAL cName

...

IF ( lNewCode )
lNewCode := .F.
nIndex := FIELD->COD
cName := FIELD->NAIM
// Увы, не помню формат функции FWRITE() !
FWRITE( nHandle, STR( nIndex, 10 ) + CRLF )
FWRITE( nHandle, TAB + cName + CRLF )
ENDIF

...

IF ( nIndex != FIELD->COD )
lNewCode := .T.
ELSEIF ( cName != FIELD->NAIM )
FWRITE( nHandle, TAB + NAIM + CRLF )
ENDIF


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 42
Зарегистрирован: 11.12.06
ссылка на сообщение  Отправлено: 02.03.07 15:49. Заголовок: Re:


index on COD+NAIM unique

далее - проход по базе и если какое-нибуь значение COD встречается более одного раза - ошибка

OldCOD := NIL
go top
while !eof()
if COD == OldCOD
?"Error:", COD,NAIM
end
end

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 645
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.07 16:06. Заголовок: Re:


suv3 пишет:

 цитата:
index on COD+NAIM unique


Эта идея была изначально , но сразу отмёл , так как задача сетевая и не хотелось
блокировать базу на момент такой проверки в то время как задачу юзает 40 человечиков ;)
По жизни такой индекс не нужен.
Поэтому сделал в 2 прохода.
Сначала по кодам проверил , затем по наименованиям. Работает шустро.
Всем спасибо !!!!!!!!!

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 646
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.07 16:11. Заголовок: Re:


Григорьев Владимир пишет:

 цитата:
Я бы все записал не в массив (массив ограничен 4096 записями)


Cогласен , но это не критично.
Максимум по одному коду может набежать не более 50 позиций (теоретически)
А если уж упадет при переполнении тогда что то другое думать буду.
По ходу в твоем коде не вижу где выясняется какая позиция наиболее корректна , ты просто
скидываешь результат в файл......
Просто сбрасывать можно с успехом и через SET ALTERNATE.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 289
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.07 17:06. Заголовок: Re:


Dima пишет:

 цитата:
По ходу в твоем коде не вижу где выясняется какая позиция наиболее корректна , ты просто



Всегда есть место для творчества!

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 647
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.07 17:50. Заголовок: Re:


Григорьев Владимир пишет:

 цитата:
Всегда есть место для творчества!



Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 678
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет